Advertisement
Tony041010

DSA_DSA

Mar 23rd, 2024
488
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.14 KB | Source Code | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. #define ll long long int
  5. // #define MAXN 1000000
  6. // #define MAXT 500000
  7. // #define MAXM 500000
  8. #define MAXN 100
  9. #define MAXT 50
  10. #define MAXM 50
  11.  
  12. typedef struct {
  13.     ll *array;
  14.     ll size;
  15.     ll capacity;
  16. } Vector;
  17.  
  18. void Vector_init(Vector *vec) {
  19.     vec->array = NULL;
  20.     vec->size = 0;
  21.     vec->capacity = 0;
  22. }
  23.  
  24. void Vector_push_back(Vector *vec, ll value) {
  25.     if (vec->size == vec->capacity) {
  26.         vec->capacity = (vec->capacity == 0) ? 1 : vec->capacity * 2;
  27.         vec->array = (ll *)realloc(vec->array, vec->capacity * sizeof(ll));
  28.     }
  29.     vec->array[vec->size] = value;
  30.     vec->size++;
  31. }
  32.  
  33. int PowerBinarySearch(ll power[MAXN+1], ll standard, int l, int r)
  34. {
  35.     int m = -1;
  36.     while(l < r){
  37.         m = ((l+r+1)/2); // why +1? I want the one who is slightly on the right
  38.         //printf("l: %d r: %d m: %d\n", l, r, m);
  39.         if(power[m] >= standard){
  40.             l = m;
  41.         }
  42.         else{
  43.             r = m-1;
  44.         }
  45.     }
  46.     if(m == -1){
  47.         return -1;
  48.     }
  49.     else{
  50.         return r;
  51.     }
  52. }
  53.  
  54. void PrintStatus(int label[MAXN+1], ll power[MAXN+1], int N)
  55. {
  56.     printf("-------------------\n");
  57.     printf("Format : Label(rank): power\n");
  58.     for(int i = 1 ; i <= N ; i++){
  59.         printf("%d(%d): %lld\n", label[i], i, power[i]);
  60.     }
  61.     printf("-------------------\n");
  62.     return;
  63. }
  64.  
  65. void PrintVector(Vector *vec){
  66.     for(int i = 0 ; i < vec->size ; i++){
  67.         printf("%lld ",vec->array[i]);
  68.     }
  69.     printf("\n");
  70.     return;
  71. }
  72.  
  73. void Attack(int label[MAXN+1], int rank[MAXN+1], ll power[MAXN+1], Vector* power_gains, int attack_times[MAXN+1], int attacker, int N, int M)
  74. {
  75.     if(attacker > N || attacker < 1){
  76.         //printf("Attcker not found.\n");
  77.         return;
  78.     }
  79.  
  80.     int attacker_rank = rank[attacker];
  81.     //printf("Attacker_rank: %d\n", attacker_rank);
  82.     if(attacker_rank == 1){
  83.         //printf("The top one attacks.\n");
  84.     }
  85.     else{
  86.         attack_times[label[attacker_rank]]++;
  87.         // printf("The %d-th time attack of player %d.\n", attack_times[label[attacker_rank]], label[attacker_rank]);
  88.         // printf("Gained power : %lld\n", power[attacker_rank-1] - power[attacker_rank]);
  89.         // printf("Pushing powergains\n");
  90.         int attacker_label = label[attacker_rank];
  91.         if(power_gains->size == 0){
  92.             Vector_push_back(power_gains, power[attacker_rank-1] - power[attacker_rank]);
  93.             // PrintVector(power_gains);
  94.         }
  95.         else{
  96.             Vector_push_back(power_gains, power_gains->array[power_gains->size-1] + (power[attacker_rank-1] - power[attacker_rank]));
  97.             // PrintVector(power_gains);
  98.         }
  99.         // printf("Done\n");
  100.  
  101.         rank[label[attacker_rank]]--;
  102.         rank[label[attacker_rank-1]]++;
  103.  
  104.         power[attacker_rank] = power[attacker_rank-1];
  105.         int temp_label = label[attacker_rank];
  106.         label[attacker_rank] = label[attacker_rank-1];
  107.         label[attacker_rank-1] = temp_label;
  108.     }
  109.  
  110.     return;
  111. }
  112.  
  113. void Reward(ll power[MAXN+1], int N)
  114. {
  115.     for(int i = 1 ; i <= N ; i++){
  116.         power[i] += (N-i);
  117.     }
  118.     return;
  119. }
  120.  
  121. void Query(int label[MAXN+1], ll power[MAXN+1], ll standard, int N)
  122. {
  123.     if(standard > power[1]){
  124.         printf("0 0\n");
  125.         return;
  126.     }
  127.  
  128.     int last_rank = PowerBinarySearch(power, standard, 1, N);
  129.     if(last_rank == -1){
  130.         printf("0 0\n");
  131.     }
  132.     else{
  133.         printf("%d %d\n", last_rank, label[last_rank]);
  134.     }
  135.     return;
  136. }
  137.  
  138.  
  139. void GetPowerGains(Vector* power_gains, int attack_times[MAXN+1], int target_label, int attack_tms)
  140. {
  141.     if(power_gains->size == 0){
  142.         printf("0\n");
  143.         return;
  144.     }
  145.     if(attack_tms >= attack_times[target_label]){ // the total gains
  146.         printf("%lld\n", power_gains->array[power_gains->size-1]);
  147.     }
  148.     else{
  149.         // printf("Size : %lld\n", power_gains->size);
  150.         int index = attack_times[target_label] - attack_tms - 1;
  151.         // printf("INdex: %lld\n", index);
  152.         printf("%lld\n", power_gains->array[power_gains->size-1] - power_gains->array[index]);
  153.     }
  154.     return;
  155. }
  156.  
  157. void PrintGameRecord(Vector power_gains[MAXN+1], int attack_times[MAXN+1], int N)
  158. {
  159.     printf("\n");
  160.     for(int i = 1 ; i <= N ; i++){
  161.         printf("%d ", attack_times[i]);
  162.         // ll gained_power[MAXN+1] = {0};
  163.         for(int j = 0 ; j < power_gains[i].size ; j++){
  164.             if(j == 0){
  165.                 printf("%lld ", power_gains[i].array[j]);
  166.             }
  167.             else{
  168.                 printf("%lld ", power_gains[i].array[j] - power_gains[i].array[j-1]);
  169.             }
  170.         }
  171.         printf("\n");
  172.     }
  173.     return;
  174. }
  175.  
  176. int main()
  177. {
  178.  
  179.     int N, T, M;
  180.     scanf("%d%d%d", &N, &T, &M);
  181.  
  182.     // both index are labels
  183.     int label[MAXN+1] = {0};
  184.     int rank[MAXN+1] = {0};
  185.     ll power[MAXN+1];
  186.     label[0] = -1;
  187.     power[0] = -1;
  188.  
  189.     Vector power_gains[MAXN+1];
  190.     power_gains;
  191.     int attack_times[MAXN+1] = {0};
  192.     for(int i = 1 ; i <= N ; i++){
  193.         label[i] = i;
  194.         rank[i] = i;
  195.         Vector_init(&(power_gains[i]));
  196.  
  197.         scanf("%lld", &(power[i]));
  198.     }
  199.  
  200.  
  201.     for(int i  = 0 ; i < T ; i++){
  202.         int type;
  203.         scanf("%d", &type);
  204.         if(type == 1){
  205.             int attacker;
  206.             scanf("%d", &attacker);
  207.             Attack(label, rank, power, &(power_gains[attacker]), attack_times, attacker, N, M);
  208.             //PrintStatus(label, power, N);
  209.         }
  210.         else if(type == 2){
  211.             Reward(power, N);
  212.             //PrintStatus(label, power, N);
  213.         }
  214.         else if(type == 3){
  215.             ll standard;
  216.             scanf("%lld", &standard);
  217.             Query(label, power, standard, N);
  218.         }
  219.         else if(type == 4){
  220.             int target_label, attack_tms;
  221.             scanf("%d%d", &target_label, &attack_tms);
  222.             GetPowerGains(&(power_gains[target_label]), attack_times, target_label, attack_tms);
  223.         }
  224.         else{
  225.             printf("Wrond type.\n");
  226.             exit(1);
  227.         }
  228.     }
  229.     PrintGameRecord(power_gains, attack_times, N);
  230.     return 0;
  231. }
Tags: DSA_HW1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement