牛客周赛 Round 57

 

B

可以直接统计每条边两个点的情况即可,不用DFS。

 

 

F

写法和这个差不多。可以用map、set、统计这些方法,计算动态的一个数组的最大数

可以直接用map统计就行,map已经自动给你排好序了(从小到大)。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 #define LL long long
  4 #define ULL unsigned long long
  5 
  6 const LL mod_1=1e9+7;
  7 const LL mod_2=998244353;
  8 
  9 const double eps_1=1e-5;
 10 const double eps_2=1e-10;
 11 
 12 const int maxn=1e5+10;
 13 
 14 vector<int> vec[maxn];
 15 map<int,int> mp[maxn];
 16 set<int> st[maxn];
 17 int value[maxn*2], single_min[maxn];
 18 
 19 void build(int index, int l, int r)
 20 {
 21     if (l==r)
 22         value[index] = single_min[l];
 23     else
 24     {
 25         int mid = (l+r)/2;
 26         build(index*2,l,mid);
 27         build(index*2+1,mid+1,r);
 28 
 29         value[index] = min(value[index*2],value[index*2+1]);
 30     }
 31 }
 32 
 33 void modify(int index, int l, int r, int k)
 34 {
 35     if (l==r)
 36         value[index] = single_min[k];
 37     else
 38     {
 39         int mid = (l+r)/2;
 40         if (l<=k && k<=mid)
 41             modify(index*2,l,mid,k);
 42         if (mid+1<=k && k<=r)
 43             modify(index*2+1,mid+1,r,k);
 44 
 45         value[index] = min(value[index*2],value[index*2+1]);
 46     }
 47 }
 48 
 49 int getv(int index, int l, int r, int k)
 50 {
 51     if (r<=k)
 52         return value[index];
 53     else
 54     {
 55         int mid = (l+r)/2, result=INT_MAX;
 56         if (l<=k)
 57             result = min( result, getv(index*2,l,mid,k) );
 58         if (mid+1<=k)
 59             result = min( result, getv(index*2+1,mid+1,r,k) );
 60         return result;
 61     }
 62 }
 63 
 64 int main()
 65 {
 66     int n,m,i,j,k,q,t,x,x_old;
 67     scanf("%d",&n);
 68     for (i=1;i<=n;i++)
 69     {
 70         scanf("%d",&m);
 71         for (j=1;j<=m;j++)
 72         {
 73             scanf("%d",&k);
 74             vec[i].push_back(k);
 75             mp[i][k]++;
 76             st[i].insert(k);
 77         }
 78         single_min[i] = *st[i].begin();
 79     }
 80 
 81     build(1,1,n);
 82     
 83     scanf("%d",&q);
 84     while (q--)
 85     {
 86         scanf("%d",&t);
 87         if (t==1)
 88         {
 89             scanf("%d%d%d",&i,&j,&x);
 90             x_old=vec[i][j-1];
 91             if (mp[i][x_old]==1)
 92                 st[i].erase(x_old);
 93             mp[i][x_old]--;
 94             vec[i][j-1]=x;
 95             if (!mp[i][x])
 96                 st[i].insert(x);
 97             mp[i][x]++;
 98 
 99             single_min[i] = *st[i].begin();
100             modify(1,1,n,i);
101         }
102         else
103         {
104             scanf("%d",&i);
105             printf("%d\n",getv(1,1,n,i));
106         }
107     }
108 
109     return 0;
110 }

 

 

 

posted @ 2024-08-27 17:04  congmingyige  阅读(7)  评论(0编辑  收藏  举报