<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      The 2023 ICPC Asia Hangzhou Regional Contest (The 2nd Universal Cup. Stage 22: Hangzhou)

      題解:

      https://files.cnblogs.com/files/clrs97/2023hangzhou_tutorials-2-22.pdf

       

      Code:

      A. Submissions

      #include <bits/stdc++.h>
      using namespace std;
      using Submission = tuple<string, char, int, string>;
      using Score = pair<int, int>;
      Score operator+(const Score &s0, const Score &s1) {
        return Score(s0.first + s1.first, s0.second + s1.second);
      }
      Score operator-(const Score &s0, const Score &s1) {
        return Score(s0.first - s1.first, s0.second - s1.second);
      }
      int main() {
        cin.tie(nullptr)->sync_with_stdio(false);
        int T;
        cin >> T;
        for (int ti = 0; ti < T; ti += 1) {
          int n = 0, m;
          cin >> m;
          vector<Submission> submissions(m);
          unordered_map<string, int> mp;
          vector<string> names;
          vector<array<vector<pair<int, bool>>, 26>> tp;
          for (auto &[c, p, t, s] : submissions) {
            cin >> c >> p >> t >> s;
            if (not mp.count(c)) {
              mp[c] = n++;
              names.push_back(c);
              tp.emplace_back();
            }
            tp[mp[c]][p - 'A'].emplace_back(t, s == "accepted");
          }
          auto print = [&](string s) {
            cout << count(s.begin(), s.end(), '1') << "\n";
            for (int i = 0; i < n; i += 1) {
              if (s[i] == '1') { cout << names[i] << " "; }
            }
            cout << "\n";
          };
          auto score = [&](const vector<pair<int, bool>> &vp) -> Score {
            int p = 0;
            for (auto [t, s] : vp) {
              if (s) { return Score(1, -t - p); }
              p += 20;
            }
            return Score(0, 0);
          };
          vector<Score> s(n), bs(n), ws(n);
          for (int i = 0; i < n; i += 1) {
            for (int j = 0; j < 26; j += 1) { s[i] = s[i] + score(tp[i][j]); }
            bs[i] = ws[i] = s[i];
            for (int j = 0; j < 26; j += 1) {
              auto vp = tp[i][j];
              if (not vp.empty()) { vp[0].second = true; }
              bs[i] = max(bs[i], s[i] - score(tp[i][j]) + score(vp));
            }
            for (int j = 0; j < 26; j += 1) {
              auto vp = tp[i][j];
              for (auto &[t, s] : vp) {
                if (s) {
                  s = false;
                  break;
                }
              }
              ws[i] = min(ws[i], s[i] - score(tp[i][j]) + score(vp));
            }
          }
          int k = n - count(s.begin(), s.end(), Score(0, 0));
          int r = min((k + 9) / 10, 35);
          auto ss = s;
          sort(ss.begin(), ss.end());
          string ans(n, '0');
          if (k == 0) { ss.emplace_back(1, numeric_limits<int>::min()); }
          for (int i = 0; i < n; i += 1) {
            if (bs[i] >= ss[n - r]) { ans[i] = '1'; }
            if (bs[i].first and not s[i].first and min(k / 10 + 1, 35) > r and
                bs[i] >= ss[n - r - 1]) {
              ans[i] = '1';
            }
          }
          if (r == n or ss[n - r - 1] == ss[n - r]) {
            print(ans);
            continue;
          }
          int ok = 0;
          for (int i = 0; i < n; i += 1) {
            if (s[i] >= ss[n - r]) {
              if (ws[i] <= ss[n - r - 1]) {
                if (ws[i].first or min((k + 8) / 10, 35) == r) { ok = 1; }
              }
            }
            if (s[i].first == 0) {
              int m = -1;
              for (auto &p : tp[i]) {
                if (not p.empty()) {
                  m = max(m, p.back().first + ((int)p.size() - 1) * 20);
                }
              }
              if (m != -1 and Score(1, -m) <= ss[n - r - 1] and
                  min(k / 10 + 1, 35) > r) {
                ok = 1;
              }
            }
          }
          if (ok) {
            for (int i = 0; i < n; i += 1) {
              if (s[i] == ss[n - r - 1]) { ans[i] = '1'; }
            }
          }
          print(ans);
        }
      }
      

        

      B. Festival Decorating

      #include<cstdio>
      #include<cmath>
      #include<algorithm>
      using namespace std;
      typedef double ld;
      const int N=550001,LIM=1028;
      const ld pi=acosl(-1.0);
      int n,q,mx,i,j,k,x,c,loc[N],col[N],val[N],l,r,ans[N],pos[N];
      struct comp{
        ld r,i;comp(ld _r=0,ld _i=0){r=_r,i=_i;}
        void clear(){r=i=0;}
        comp operator+(const comp&x)const{return comp(r+x.r,i+x.i);}
        comp operator-(const comp&x)const{return comp(r-x.r,i-x.i);}
        comp operator*(const comp&x)const{return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
      }A0[N],A1[N],A2[N],B0[N],B1[N],B2[N],F[N],w[N],ww[N];
      inline void FFT(comp a[],int n,int o){
        for(int i=1;i<n;i++)if(i<pos[i])swap(a[i],a[pos[i]]);
        for(int d=0,k=__builtin_ctz(n);(1<<d)<n;d++){
          int m=1<<d,m2=m<<1;
          for(int i=0;i<n;i+=m2)for(int j=0;j<m;j++){
            comp&A=a[i+j+m],&B=a[i+j],t=(o==1?w[j<<(k-d)]:ww[j<<(k-d)])*A;
            A=B-t;B=B+t;
          }
        }
        if(o==-1)for(int i=0;i<n;i++)a[i].r/=n;
      }
      inline void solve(int x,int l,int r){
        for(;l<=r;l++)if(val[loc[l]+x]&&col[l]!=val[loc[l]+x]){
          ans[x]=l;
          break;
        }
      }
      int main(){
        scanf("%d%d",&n,&q);
        for(i=1;i<=n;i++){
          scanf("%d%d",&loc[i],&col[i]);
          val[loc[i]]=col[i];
          if(loc[i]>mx)mx=loc[i];
        }
        for(k=1;k<mx*2;k<<=1);
        j=__builtin_ctz(k)-1;
        for(i=0;i<k;i++)pos[i]=pos[i>>1]>>1|((i&1)<<j);
        for(i=0;i<k;i++)w[i]=comp(cosl(pi*i/k),sinl(pi*i/k));
        for(i=0;i<k;i++)ww[i]=w[i],ww[i].i*=-1;
        for(i=1;i<=n;i++){
          x=loc[i],c=col[i];
          B0[x].r=1;
          B1[x].r=-2*c;
          B2[x].r=((ld)c)*((ld)c);
        }
        FFT(B0,k,1);
        FFT(B1,k,1);
        FFT(B2,k,1);
        l=min(n,LIM);
        for(i=1;i<mx;i++)solve(i,1,l);
        l++;
        while(l<=n){
          r=l*3;
          if(r&1)r--;
          r=min(r,n);
          for(i=0;i<k;i++){
            A0[i].clear();
            A1[i].clear();
            A2[i].clear();
          }
          for(i=l;i<=r;i++){
            x=mx-loc[i],c=col[i];
            A0[x].r=((ld)c)*((ld)c);
            A1[x].r=c;
            A2[x].r=1;
          }
          FFT(A0,k,1);
          FFT(A1,k,1);
          FFT(A2,k,1);
          for(i=0;i<k;i++)F[i]=A0[i]*B0[i]+A1[i]*B1[i]+A2[i]*B2[i];
          FFT(F,k,-1);
          for(i=1;i<mx;i++){
            if(ans[i])continue;
            if(F[mx+i].r>0.5)ans[i]=r/2;
          }
          l=r+1;
        }
        while(q--)scanf("%d",&x),printf("%d\n",ans[x]);
      }
      /*
      [l,3l]
      1.5l
      */
      

        

      C. Yet Another Shortest Path Query

      #include<cstdio>
      #include<algorithm>
      #include<vector>
      using namespace std;
      typedef pair<int,int>P;
      const int BUF=50000000;
      char Buf[BUF],*buf=Buf;
      inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
      const int OUT=13000000;
      char Out[OUT],*ou=Out;int Outn[15],Outcnt;
      inline void write(int x){
        if(x==-1){
          *ou++='-';
          *ou++='1';
          return;
        }
        if(!x)*ou++=48;
        else{
          for(Outcnt=0;x;x/=10)Outn[++Outcnt]=x%10+48;
          while(Outcnt)*ou++=Outn[Outcnt--];
        }
      }
      inline void writeln(int x){write(x);*ou++='\n';}
      const int N=1000005,M=N*3,Q=1000005,inf=500000000;
      int n,m,cq,i,x,y,z,ans[Q],e[M][3],deg[N],g[N],v[M<<1],nxt[M<<1],ed;
      int q[N],h,t,ord[N];bool vis[N];
      vector<P>ga[N],gr[N];
      inline void add(int x,int y){deg[x]++;v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
      inline void ext(int x){if(deg[x]<=5&&!vis[x])vis[q[++t]=x]=1;}
      inline void up(int&a,int b){a>b?(a=b):0;}
      struct E{int o,x,y,z;E(){}E(int _o,int _x,int _y,int _z){o=_o,x=_x,y=_y,z=_z;}};
      int cur,val[N],last[N];
      inline void update(int x,int y){if(last[x]!=cur)last[x]=cur,val[x]=y;else up(val[x],y);}
      namespace TWO{
      const int MAXQ=Q*20;
      int ce,cnt[N],pool[MAXQ];E e[MAXQ];
      inline void solve(int o,int x,int y,int z){
        if(x==y){up(ans[o],z);return;}
        e[++ce]=E(o,x,y,z);
        cnt[x]++;
        e[++ce]=E(o,y,x,z);
        cnt[y]++;
      }
      inline void single(int x){
        if(x==cur)return;
        cur=x;
        for(const auto&A:ga[x]){
          update(A.first,A.second);
          for(const auto&B:gr[A.first])update(B.first,A.second+B.second);
        }
      }
      void run(){
        int i,u;
        for(i=1;i<=n;i++)cnt[i]+=cnt[i-1];
        for(i=1;i<=ce;i++)pool[cnt[e[i].x]--]=i;
        for(cur=0,i=1;i<=n;i++)last[i]=0;
        for(i=1;i<=ce;i++){
          u=pool[i];
          single(e[u].x);
          if(last[e[u].y]==cur)up(ans[e[u].o],val[e[u].y]+e[u].z);
        }
      }
      }
      namespace THREE{
      const int MAXQ=Q*2;
      int ce,cnt[N],pool[MAXQ];E e[MAXQ];
      inline void solve(int o,int x,int y){
        for(const auto&A:gr[x])TWO::solve(o,y,A.first,A.second);
        for(const auto&A:gr[y])TWO::solve(o,x,A.first,A.second);
        e[++ce]=E(o,x,y,0);
        cnt[x]++;
        e[++ce]=E(o,y,x,0);
        cnt[y]++;
      }
      inline void single(int x){
        if(x==cur)return;
        cur=x;
        for(const auto&A:ga[x])for(const auto&B:gr[A.first]){
          int w=A.second+B.second;
          update(B.first,w);
          for(const auto&C:gr[B.first])update(C.first,w+C.second);
        }
      }
      void run(){
        int i,u;
        for(i=1;i<=n;i++)cnt[i]+=cnt[i-1];
        for(i=1;i<=ce;i++)pool[cnt[e[i].x]--]=i;
        for(cur=0,i=1;i<=n;i++)last[i]=0;
        for(i=1;i<=ce;i++){
          u=pool[i];
          single(e[u].x);
          if(last[e[u].y]==cur)up(ans[e[u].o],val[e[u].y]);
        }
      }
      }
      int main(){
        fread(Buf,1,BUF,stdin);read(n);read(m);
        for(i=1;i<=m;i++){
          read(x);read(y);read(z);
          e[i][0]=x,e[i][1]=y,e[i][2]=z;
          add(x,y),add(y,x);
        }
        for(h=i=1;i<=n;i++){
          ext(i);
          ga[i].reserve(deg[i]);
          gr[i].reserve(5);
        }
        while(h<=t)for(i=g[x=q[h++]];i;i=nxt[i]){
          y=v[i];
          if(vis[y])continue;
          deg[y]--;
          ext(y);
        }
        for(i=1;i<=n;i++)ord[q[i]]=i;
        for(i=1;i<=m;i++){
          x=e[i][0],y=e[i][1],z=e[i][2];
          if(ord[x]>ord[y])swap(x,y);
          gr[x].emplace_back(P(y,z));
          ga[x].emplace_back(P(y,z));
          ga[y].emplace_back(P(x,z));
        }
        read(cq);
        for(i=1;i<=cq;i++){
          read(x);read(y);
          ans[i]=inf;
          THREE::solve(i,x,y);
        }
        TWO::run();
        THREE::run();
        for(i=1;i<=cq;i++){
          x=ans[i];
          if(x==inf)x=-1;
          writeln(x);
        }
        fwrite(Out,1,ou-Out,stdout);
      }
      

        

      D. Operator Precedence

      #include "bits/stdc++.h"
      using namespace std;
      int main()
      {
      	ios::sync_with_stdio(0); cin.tie(0);
      	int T; cin>>T;
      	while (T--)
      	{
      		int n,i;
      		cin>>n;
      		cout<<2*n-3;
      		for (i=1; i<n; i++) cout<<" 2 -1";
      		cout<<" 1\n";
      	}
      }
      

        

      E. Period of a String

      #include<bits/stdc++.h>
      using namespace std;
      int n ;
      string s[100005];
      struct my_list {
          int num[26] , id;
          my_list() {
              memset(num,0,sizeof(num)) ;
          }
      }p[100005];
      int L[100005];
      bool operator < (const my_list &A,const my_list &B) {
          return A.id < B.id;
      }
      void solv() {
          cin >> n;
          for(int i = 1;i <= n;i++) {
              cin >> s[i] ;
              memset(p[i].num,0,sizeof(p[i].num)) ;
              L[i] = s[i].size() ;
              for(int j = 0;j < s[i].size();j++) {
                  p[i].num[s[i][j] - 'a']++; 
              }
              p[i].id = i;
          }
          set<pair<int,my_list> > st;
          bool ok = 1;
          for(int i = n;i >= 1 && ok;i--) {
              while(st.size() && (--st.end())->first >= L[i] && ok) {
                  auto it = st.end() ; it-- ;
                  int len = it->first ;
                  my_list k = it->second ;
                  st.erase(it) ;
       
                  int pr = len / L[i] ; len %= L[i] ;
                  for(int j = 0;j < 26;j++) {
                      if(k.num[j] < 1LL * p[i].num[j] * pr) {ok = 0 ; break ;} ///有可能爆int,記得卡
                      k.num[j] -= p[i].num[j] * pr; 
                  }
       
                  if(len) st.insert({len , k}) ;
              }
              st.insert({L[i] , p[i]}) ;
          }
          if(!ok) {
              cout << "NO\n" ; return ;
          }
          vector<pair<int,my_list> > v(st.begin() , st.end()) ;
       
          string s1 ;
          my_list cur ; 
          for(int i = 0;i < v.size() && ok;i++) {
              // printf("%d : " , v[i].first) ;
              for(int j = 0;j < 26;j++) {
                  // printf("%d ",v[i].second.num[j]) ;
                  if(v[i].second.num[j] >= cur.num[j]) {
                      for(int k = cur.num[j] + 1 ; k <= v[i].second.num[j] ; k++) s1 += (j + 'a') ;
                      cur.num[j] = v[i].second.num[j] ;
                  }
                  else {ok = 0 ; break ;}
              }
              // printf("\n") ;
          }
          if(!ok) {
              cout << "NO\n" ; return ;
          }
          cout << "YES\n" ;
          for(int i = 1 ; i <= n;i++) {
              cout << s1 << '\n' ;
              if(i == n) break ;
              if(L[i + 1] < s1.size()) s1.resize(L[i + 1]) ;
              else {
                  int d = s1.size() ;
                  for(int j = s1.size() ; j < L[i + 1] ; j++) s1 += (s1[j % d]) ;
              }
          }
          return ;
      }
      int main() {
          //freopen("in.txt","r",stdin) ;
          ios::sync_with_stdio(false) ; cin.tie(0) ; cout.tie(0) ;
          int t;cin >> t;
          while(t--) solv() ;
      }
      

        

      F. Top Cluster

      #include<cstdio>
      #include<algorithm>
      using namespace std;
      typedef long long ll;
      const int N=500005,K=21;
      const int BUF=30000000;
      char Buf[BUF],*buf=Buf;
      inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
      inline void readll(ll&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
      const int OUT=7000000;
      char Out[OUT],*ou=Out;int Outn[15],Outcnt;
      inline void write(int x){
        if(!x)*ou++=48;
        else{
          for(Outcnt=0;x;x/=10)Outn[++Outcnt]=x%10+48;
          while(Outcnt)*ou++=Outn[Outcnt--];
        }
      }
      inline void writeln(ll x){write(x);*ou++='\n';}
      int n,m,mx,i,j,x,y,z,id[N];
      int g[N],v[N<<1],w[N<<1],nxt[N<<1],ed,dfn,loc[N],Log[N<<1];
      ll d[N],q[K][N<<1],k;
      inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
      void dfs(int x,int y){
        q[0][loc[x]=++dfn]=d[x];
        for(int i=g[x];i;i=nxt[i])if(v[i]!=y){
          d[v[i]]=d[x]+w[i];
          dfs(v[i],x);
          q[0][++dfn]=d[x];
        }
      }
      inline ll lca(int x,int y){
        x=loc[x],y=loc[y];
        if(x>y)swap(x,y);
        int k=Log[y-x+1];
        return min(q[k][x],q[k][y-(1<<k)+1]);
      }
      inline ll dis(int x,int y){return x==y?0:d[x]+d[y]-lca(x,y)*2;}
      struct P{
        int a,b;ll d;
        P(){}
        P(int x){a=b=x,d=0;}
        void add(int x){
          ll now=dis(x,a);
          int na=a,nb=b;
          if(now>d)d=now,na=a,nb=x;
          now=dis(x,b);
          if(now>d)d=now,na=b,nb=x;
          a=na,b=nb;
        }
      }dia[N];
      inline int ask(int x,ll k){
        int ret=mx+1,l=0,r=mx,mid;
        while(l<=r){
          mid=(l+r)>>1;
          if(dis(x,dia[mid].a)>k||dis(x,dia[mid].b)>k)r=(ret=mid)-1;else l=mid+1;
        }
        return ret;
      }
      int main(){
        fread(Buf,1,BUF,stdin);
        read(n);read(m);
        for(i=1;i<=n;i++){
          read(x);
          if(x<n)id[x]=i;
        }
        for(i=1;i<n;i++){
          read(x);read(y);read(z);
          add(x,y,z);
          add(y,x,z);
        }
        dfs(1,0);
        for(i=2;i<=dfn;i++)Log[i]=Log[i>>1]+1;
        for(i=1;i<K;i++)for(j=1;j+(1<<i)-1<=dfn;j++)q[i][j]=min(q[i-1][j],q[i-1][j+(1<<(i-1))]);
        for(i=0;i<n;i++){
          x=id[i];
          if(!x)break;
          if(!i)dia[i]=P(x);
          else{
            dia[i]=dia[i-1];
            dia[i].add(x);
          }
          mx=i;
        }
        while(m--){
          read(x);readll(k);
          writeln(ask(x,k));
        }
        fwrite(Out,1,ou-Out,stdout);
      }
      

        

      G. Snake Move

      #include<cstdio>
      typedef unsigned long long ull;
      const int N=3005,K=100005,inf=~0U>>1;
      int n,m,k,i,j,x,y,sx,sy;
      int pos[K][2],lim[N][N],f[N][N],h,t,q[N*N][2];
      char a[N][N];
      inline void ext(int x,int y,int z){
        if(x<1||x>n||y<1||y>m)return;
        if(a[x][y]=='#')return;
        if(z<lim[x][y]){
          z=lim[x][y];
          if(z<f[x][y])f[x][y]=z;
          return;
        }
        if(z>=f[x][y])return;
        f[x][y]=z;
        q[++t][0]=x;
        q[t][1]=y;
      }
      inline void branch(int x,int y,int z){
        if(f[x][y]!=z)return;
        z++;
        ext(x-1,y,z);
        ext(x+1,y,z);
        ext(x,y-1,z);
        ext(x,y+1,z);
      }
      int main(){
        scanf("%d%d%d",&n,&m,&k);
        scanf("%d%d",&sx,&sy);
        for(i=k-1;i;i--){
          scanf("%d%d",&x,&y);
          lim[x][y]=i;
          pos[i][0]=x;
          pos[i][1]=y;
        }
        for(i=1;i<=n;i++)scanf("%s",a[i]+1);
        for(i=1;i<=n;i++)for(j=1;j<=m;j++)f[i][j]=inf;
        ext(sx,sy,0);
        i=1;
        while(1){
          int f1=inf;
          if(h<=t){
            x=q[h][0];
            y=q[h][1];
            f1=f[x][y];
          }
          int f2=i<k?i:inf;
          if(f1==inf&&f2==inf)break;
          if(f1<f2){
            branch(x,y,f1);
            h++;
          }else{
            branch(pos[i][0],pos[i][1],i);
            i++;
          }
        }
        ull ans=0;
        for(i=1;i<=n;i++)for(j=1;j<=m;j++){
          ull tmp=f[i][j];
          //printf("%d%c",f[i][j]==inf?-1:f[i][j],j<m?' ':'\n');
          if(tmp==inf)continue;
          ans+=tmp*tmp;
        }
        printf("%llu",ans);
      }
      

        

      H. Sugar Sweet II

      #include <bits/stdc++.h>
      using namespace std;
      int n;
      int a[500005] , b[500005] , w[500005];
      vector<int> E[500005];
      int len[500005];
      int st[500005];
      bool vis[500005];
      void dfs(int u , int d) {
          vis[u] = 1; len[u] = d;
          for(auto v : E[u]) {
              if(!vis[v] && st[v] == 1) dfs(v , d + 1) ;
          }
      }
      int t[500005];
      const int mod = 1e9 + 7;
      int fpow(int a,int b) {
          int ans = 1;
          while(b) {
              if(b & 1) ans = 1LL * ans * a % mod;
              a = 1LL*a*a%mod;b >>= 1;
          }
          return ans;
      }
      void solv() {
          cin >> n;
          for(int i = 1;i <= n;i++) E[i].clear() , len[i] = vis[i] = 0;
          for(int i = 1;i <= n;i++) cin >> a[i];
          for(int i = 1;i <= n;i++) {
              cin >> b[i];
              E[b[i]].push_back(i) ;
          }
          for(int i = 1;i <= n;i++) cin >> w[i];
          for(int i = 1;i <= n;i++) {
              if(i == b[i] || a[i] >= a[b[i]] + w[b[i]]) st[i] = 0 ; ///不會發生
              else if(a[i] >= a[b[i]] && a[i] < a[b[i]] + w[b[i]]) st[i] = 1 ; ///只有父親發生了才能發生
              else st[i] = 2 ; ///一定發生
          }
          for(int i = 1;i <= n;i++) {
              if(st[i] == 2) dfs(i , 1) ;
          }
          t[0] = 1; t[1] = 1;
          for(int i = 2;i <= n;i++) t[i] = 1LL * (mod - mod / i) * t[mod % i] % mod;
          for(int i = 1;i <= n;i++) t[i] = 1LL * t[i] * t[i - 1] % mod;
       
          for(int i = 1;i <= n;i++) {
              if(len[i]) cout << (a[i] + 1LL * t[len[i]] * w[i]) % mod <<' ';
              else cout << a[i] <<' ';
          }
          cout << '\n' ;
      }
      int main() {
          // freopen("in.txt","r",stdin);
          ios::sync_with_stdio(false) ; cin.tie(0) ;cout.tie(0) ;
          int t ; cin >> t;
          while(t--) solv() ;
      }
      

        

      I. Dreamy Putata

      #include<cstdio>
      #include<algorithm>
      using namespace std;
      const int N=100005,K=5,M=K*2+3,P=1000000007;
      int n,m,cnt,q,i,j,op,sx,sy,ex,ey,inv[101];
      int pos[N],pl[N][K],pr[N][K],pu[N][K],pd[N][K];
      int val[262155][K*2][M],A[K*2][M],B[K*2][M],C[K*2][M],g[M][M],e[M];
      bool flag;
      const int BUF=30000000;
      char Buf[BUF],*buf=Buf;
      inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
      inline int po(int a,int b){int t=1;for(;b;b>>=1,a=1LL*a*a%P)if(b&1)t=1LL*t*a%P;return t;}
      inline void init(int v[][M],int x){
        for(int i=0;i<m;i++){
          v[i][i+m]=1;
      /*
      E[x,i]=(pl[x][i]*E[x,i-1]+pr[x][i]*E[x,i+1]+pu[x][i]*E[x-1,i]+pd[x][i]*E[x+1,i])/100+1
      100*E[x,i]=pl[x][i]*E[x,i-1]+pr[x][i]*E[x,i+1]+pu[x][i]*E[x-1,i]+pd[x][i]*E[x+1,i]+100
      pd[x][i]*E[x+1,i]=100*E[x,i]-pl[x][i]*E[x,i-1]-pr[x][i]*E[x,i+1]-pu[x][i]*E[x-1,i]-100
      pd[x][i]*E[x+1,i]=100*v[i]-pl[x][i]*E[x,i-1]-pr[x][i]*E[x,i+1]-pu[x][i]*E[x-1,i]-100
      */
          int _inv=inv[pd[x][i]];
          v[i+m][i+m]=100LL*_inv%P;
          v[i+m][(i-1+m)%m+m]=1LL*(P-pl[x][i])*_inv%P;
          v[i+m][(i+1)%m+m]=1LL*(P-pr[x][i])*_inv%P;
          v[i+m][i]=1LL*(P-1LL*pu[x][i])*_inv%P;
          v[i+m][cnt+1]=1LL*(P-100)*_inv%P;
        }
      }
      inline void copy(int a[][M],int b[][M]){
        for(int i=0;i<cnt;i++)for(int j=0;j<=cnt+1;j++)a[i][j]=b[i][j];
      }
      inline void merge(int f[][M],int a[][M],int b[][M]){
        static int c[K*2][M];
        for(int i=0;i<cnt;i++){
          for(int j=0;j<=cnt+1;j++)c[i][j]=0;
          c[i][cnt+1]=b[i][cnt+1];
          for(int j=0;j<cnt;j++)for(int k=0;k<=cnt+1;k++)c[i][k]=(1LL*b[i][j]*a[j][k]+c[i][k])%P;
        }
        copy(f,c);
      }
      void build(int x,int a,int b){
        if(a==b){
          pos[a]=x;
          init(val[x],a);
          return;
        }
        int mid=(a+b)>>1;
        build(x<<1,a,mid);
        build(x<<1|1,mid+1,b);
        merge(val[x],val[x<<1],val[x<<1|1]);
      }
      inline void change(int o){
        int x=pos[o];
        init(val[x],o);
        for(x>>=1;x;x>>=1)merge(val[x],val[x<<1],val[x<<1|1]);
      }
      void ask(int x,int a,int b,int c,int d){
        if(c<=a&&b<=d){
          if(!flag)flag=1,copy(B,val[x]);else merge(B,B,val[x]);
          return;
        }
        int mid=(a+b)>>1;
        if(c<=mid)ask(x<<1,a,mid,c,d);
        if(d>mid)ask(x<<1|1,mid+1,b,c,d);
      }
      inline void mul(int v[][M]){
        static int f[M];
        for(int i=0;i<cnt;i++){
          int w=v[i][cnt+1];
          for(int j=0;j<=cnt;j++)w=(1LL*v[i][j]*e[j]+w)%P;
          f[i]=w;
        }
        for(int i=0;i<cnt;i++)e[i]=f[i];
      }
      void cal(int x,int a,int b,int c,int d){
        if(c<=a&&b<=d){mul(val[x]);return;}
        int mid=(a+b)>>1;
        if(c<=mid)cal(x<<1,a,mid,c,d);
        if(d>mid)cal(x<<1|1,mid+1,b,c,d);
      }
      inline void gauss(){
        int i,j,k;
        for(i=0;i<=cnt;i++){
          for(j=i;j<=cnt;j++)if(g[j][i])break;
          if(j!=i)for(k=i;k<=cnt+1;k++)swap(g[i][k],g[j][k]);
          int inv=po(g[i][i],P-2);
          for(j=i+1;j<=cnt;j++){
            int t=1LL*g[j][i]*inv%P;
            for(k=i;k<=cnt+1;k++)g[j][k]=(g[j][k]-1LL*g[i][k]*t)%P;
          }
        }
        for(i=cnt;~i;i--){
          e[i]=g[i][cnt+1];
          for(j=i+1;j<=cnt;j++)e[i]=(e[i]-1LL*g[i][j]*e[j])%P;
          e[i]=1LL*e[i]*po(g[i][i],P-2)%P;
        }
      }
      inline int query(int sx,int sy,int ex,int ey){
      /*
      0<=ex<n-1
      ask A=[0,ex]
      ask B=[ex+1,n-1]
      in A:
        we know E(ex,ey)=0
        but E(ex+1,ey) is not right, set it into itself
      then merge C=A+B
      in C:
        we know the last row, it equals to the first m variables
        we know the row after the last row, it equals to the next m variables
       
      then we know the first row, the last row and row ex, row ex+1
       
      if sx<=ex, ask[0,sx], use row first&last to get answer
      if sx>ex, ask[ex+1,sx] use row ex..ex+1 to get answer
      */
      /*
      ex==n-1
      ask A=[0,n-1]
      we know the last row, it equals to the first m variables
      we know the row after the last row, it equals to the next m variables, except the ty-th
      we know E(ex,ey)=0
      ask[0,sx], use row first&last to get answer
      */
        flag=0;
        ask(1,0,n-1,0,ex);
        copy(A,B);
        for(int i=0;i<=cnt+1;i++)A[ey+m][i]=0;
        A[ey+m][cnt]=1;
        if(ex<n-1){
          flag=0;
          ask(1,0,n-1,ex+1,n-1);
          merge(C,A,B);
        }else copy(C,A);
        for(int i=0;i<cnt;i++){
          for(int j=0;j<=cnt;j++)g[i][j]=C[i][j];
          g[i][i]=(g[i][i]-1+P)%P;
          g[i][cnt+1]=(P-C[i][cnt+1])%P;
        }
        for(int i=0;i<=cnt;i++)g[cnt][i]=A[ey][i];
        g[cnt][cnt+1]=(P-A[ey][cnt+1])%P;
        gauss();
        if(sx<=ex)cal(1,0,n-1,0,sx);
        else{
          static int w[M];
          for(int i=0;i<cnt;i++){
            w[i]=A[i][cnt+1];
            for(int j=0;j<=cnt;j++)w[i]=(1LL*A[i][j]*e[j]+w[i])%P;
          }
          for(int i=0;i<cnt;i++)e[i]=w[i];
          cal(1,0,n-1,ex+1,sx);
        }
        return (e[sy]%P+P)%P;
      }
      int main(){
        for(inv[0]=inv[1]=1,i=2;i<=100;i++)inv[i]=1LL*(P-inv[P%i])*(P/i)%P;
        fread(Buf,1,BUF,stdin);read(n);read(m);
        for(i=0;i<n;i++)for(j=0;j<m;j++)read(pl[i][j]);//(i,j-1)
        for(i=0;i<n;i++)for(j=0;j<m;j++)read(pr[i][j]);//(i,j+1)
        for(i=0;i<n;i++)for(j=0;j<m;j++)read(pu[i][j]);//(i-1,j)
        for(i=0;i<n;i++)for(j=0;j<m;j++)read(pd[i][j]);//(i+1,j)
        cnt=m*2;
        build(1,0,n-1);
        read(q);
        while(q--){
          read(op);read(sx);read(sy);
          if(op==1){
            read(pl[sx][sy]);read(pr[sx][sy]);read(pu[sx][sy]);read(pd[sx][sy]);
            change(sx);
          }else{
            read(ex);read(ey);
            printf("%d\n",query(sx,sy,ex,ey));
          }
        }
      }
      

        

      J. Mysterious Tree

      #include<bits/stdc++.h>
      using namespace std;
      int n;
      int ask(int u,int v) {
          cout << "? " << u <<' ' << v << endl ;
          int x ; cin >> x;
          return x;
      }
      void solv() {
          cin >> n;
          int u  = -1, v = -1;
          for(int i = 1;i + 1 <= n;i += 2) {
              if(ask(i , i + 1) == 1) {
                  u = i ; v = i + 1 ; break ;
              }
          }
          if(n & 1) {
              if(ask(n , n - 1)== 1) {
                  u = n ; v = n - 1;
              }
          }
          if(u == -1) {
              cout << "! 1" << endl ; return ;
          }
          vector<int> vec;
          for(int i = 1;i <= n;i++) {
              if(i != u && i != v) vec.push_back(i) ;
          }
          if(!ask(u , vec[0])) {
              if(!ask(v , vec[0])) {
                  cout << "! 1" << endl ; return ;
              }
              swap(u , v);
          }
          if(ask(u , vec[1])) {
              cout << "! 2" << endl ; return ;
          }
          cout << "! 1" << endl ; return ;
      }
      int main () {
          int t ; cin >> t;
          while(t--) solv() ;
      }
      

        

      K. Card Game

      #include<bits/stdc++.h>
      using namespace std;
      const int N = 3e5 + 5;
      int a[N] ;
      int ch[N * 60][2] ;
      int tag[N * 60] ;
      int cnt = 0;
      int n , q;
      int rt[N] ;
      int build(int l,int r) {
          int c = ++cnt ;
          tag[c] = 0;
          if(l == r) return c;
          ch[c][0] = build(l , (l + r >> 1)) ;
          ch[c][1] = build((l + r >> 1) + 1, r);
          return c;
      }
      int modify(int x,int y,int ql,int qr,int l,int r,int tagx,int tagy) { /// [ql,qr]繼承x , ++ , < ql繼承x , >qr繼承y
          if(ql <= l && r <= qr) {
              int c = ++cnt ;
              ch[c][0] = ch[x][0];
              ch[c][1] = ch[x][1] ;
              tag[c] = tag[x] + tagx + 1;
              // printf("on %d %d , tag %d\n",l,r,tag[c]) ;
              return c;
          }
          else if(r < ql) {
              int c = ++cnt ;
              ch[c][0] = ch[x][0];
              ch[c][1] = ch[x][1];
              tag[c] = tagx + tag[x];
              return c;
          }
          else if(l > qr) {
              int c = ++cnt ;
              ch[c][0] = ch[y][0];
              ch[c][1] = ch[y][1];
              tag[c] = tagy + tag[y];
              return c;
          }
          else {
              int md = (l + r >> 1) ;
              int c = ++cnt ;
              ch[c][0] = modify(ch[x][0] , ch[y][0] , ql , qr , l , md , tagx + tag[x] , tagy + tag[y]) ;
              ch[c][1] = modify(ch[x][1] , ch[y][1] , ql , qr , md + 1 , r , tagx + tag[x] , tagy + tag[y]) ;
              return c;
          }
      }
      int qval(int rt,int pos,int l,int r) {
          if(l == r) return tag[rt] ;
          int md = (l + r >> 1) ;
          if(pos <= md) return tag[rt] + qval(ch[rt][0] , pos , l , md) ;
          else return tag[rt] + qval(ch[rt][1] , pos , md + 1, r) ;
      }
      int nxt[N] ;
      int main() {
          // freopen("in.txt","r",stdin) ;
          // freopen("out2.txt","w",stdout) ;
          ios::sync_with_stdio(false) ; cin.tie(0) ;
          cin >> n >> q;
          for(int i = 1;i <= n;i++) cin >> a[i] ;
          for(int i = 1;i <= n;i++) nxt[i] = n + 1;
          rt[n + 1] = build(1 , n) ;
          for(int i = n;i >= 1;i--) {
              // printf("on %d\n" , i) ;
              rt[i] = modify(rt[i + 1] , rt[min(n+1 , nxt[a[i]] + 1)] , i , nxt[a[i]] - 1, 1 , n , 0 , 0) ;
              nxt[a[i]] = i;
          }
          // cout << qval(rt[3] , 4 , 1 , n) << '\n' ;
          int lans = 0;
          while(q--) {
              int l , r;
              cin >> l >> r;
               l ^= lans ; r ^= lans;
              cout << (lans = qval(rt[l] , r , 1 , n)) << '\n' ;
          }
          return 0;
      }
      

        

      L. Master of Both V

      #include<bits/stdc++.h>
      using namespace std;
       
      using ll=long long;
      #define fs first
      #define sd second
       
      const int N=5e5+1e3+7;
       
      struct P {
          int x,y;
      }a[N],b[N];
       
      bool operator <(const P &a,const P &b)
      {
          return a.x<b.x||(a.x==b.x&&a.y<b.y);
      }
       
      bool operator ==(const P &a,const P &b)
      {
          return !(a<b)&&!(b<a);
      }
       
      P operator -(const P &a,const P &b)
      {
          return {a.x-b.x,a.y-b.y};
      }
       
      ll operator *(const P &a,const P &b)
      {
          return 1ll*a.x*b.y-1ll*a.y*b.x;
      }
       
      ll operator ^(const P &a,const P &b)
      {
          return 1ll*a.x*b.x+1ll*a.y*b.y;
      }
       
      using L=pair<P,P>;
       
      int T,n;
       
      L mod[N];
       
      tuple<int,int,int> e[N];
       
      int to[N];
       
      int phase(const P &a)
      {
          if(a.y!=0)
              return a.y<0;
          return a.x<0;
      }
       
      bool cmp(const P &a,const P &b)
      {
          int pa=phase(a),pb=phase(b);
          if(pa!=pb)
              return pa<pb;
          return a*b>0;
      }
       
      struct T{
          L lv,rv;
          int ok,cnt;
      }t[N*4+1];
       
      bool chk(const L &a,const L &b)
      {
          if(a==b)
              return 1;
          P u=a.sd-a.fs,v=b.sd-b.fs,w=b.fs-a.sd;
          if(w.x==0&&w.y==0)
              return u*v>0;
          return (u*w>0||(u*w==0&&(u^w)>0))&&(w*v>0||(w*v==0&&(w^v)>0));
      }
       
      void update(int x)
      {
          if(!t[x<<1].cnt)
              t[x]=t[x<<1|1];
          else if(!t[x<<1|1].cnt)
              t[x]=t[x<<1];
          else
          {
              t[x].lv=t[x<<1].lv,t[x].rv=t[x<<1|1].rv;
              t[x].ok=t[x<<1].ok&&t[x<<1|1].ok&&chk(t[x<<1].rv,t[x<<1|1].lv);
              t[x].cnt=t[x<<1].cnt+t[x<<1|1].cnt;
          }
      }
       
      int id[N];
       
      int st[N];
       
      multiset<P> seg[N];
       
      void adj(L &a,L b)
      {
          ll f=(a.sd-a.fs)*(b.fs-a.fs);
          if(f)
          {
              if(f<0)
                  swap(a.fs,a.sd);
          }
          else
          {
              f=(a.sd-a.fs)*(b.sd-a.fs);
              if(f<0)
                  swap(a.fs,a.sd);
          }
      }
       
      int m;
       
      void modify(int p,L u)
      {
          int x=p+m-1;
          if(u.fs==u.sd)
              t[x].cnt=0;
          else
              t[x].ok=1,t[x].cnt=1,t[x].lv=t[x].rv=u;
          x>>=1;
          while(x)
          {
              update(x);
              x>>=1;
          }
      }
       
      struct MODIFY{
          int r;
          L u;
          int c;
      };
       
      vector<MODIFY> ch[N],rch[N];
       
      signed main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin>>T;
          while(T--)
          {
              cin>>n;
              vector<tuple<int,int,int> >X;
              for(int i=1;i<=n;i++)
              {
                  string op;
                  cin>>op;
                  if(op=="+")
                  {
                      cin>>a[i].x>>a[i].y>>b[i].x>>b[i].y;
                      ll A=a[i].y-b[i].y,B=b[i].x-a[i].x,C=-1ll*b[i].y*a[i].x+1ll*a[i].y*b[i].x;
                      ll g=__gcd(__gcd(A,B),C);
                      A/=g,B/=g,C/=g;
                      if(A<0||(A==0&&B<0))
                          A*=-1,B*=-1,C*=-1;
                      g=abs(__gcd(A,B));
                      e[i]={A,B,C};
                      X.push_back(e[i]);
                  }
                  else
                  {
                      cin>>a[i].x;
                      a[i].y=0;
                      b[i]=a[i];
                  }
              }
              sort(X.begin(),X.end());
              X.erase(unique(X.begin(),X.end()),X.end());
              for(int i=1;i<=X.size();i++)
                  seg[i].clear(),st[i]=0;
              for(int i=1;i<=n;i++)
                  ch[i].clear(),rch[i].clear();
              for(int i=1;i<=n;i++)
              {
                  if(a[i]==b[i])
                  {
                      int x=id[a[i].x];
                      id[i]=x;
                      int j=a[i].x;
                      seg[x].erase(seg[x].find(a[j]));
                      seg[x].erase(seg[x].find(b[j]));
                      ch[st[x]].push_back({i-1,mod[st[x]],x});
                      if(!seg[x].size())
                          st[x]=0;
                      else
                          st[x]=i,mod[i]={*seg[x].begin(),*--seg[x].end()};
                  }
                  else
                  {
                      id[i]=lower_bound(X.begin(),X.end(),e[i])-X.begin()+1;
                      int x=id[i];
                      seg[x].insert(a[i]),seg[x].insert(b[i]);
                      mod[i]={*seg[x].begin(),*--seg[x].end()};
                      if(st[x])
                          ch[st[x]].push_back({i-1,mod[st[x]],x});
                      st[x]=i;
                  }
              }
              for(int i=1;i<=X.size();i++)
                  if(st[i])
                  {
                      ch[st[i]].push_back({n,mod[st[i]],i});
                      mod[n+1]=mod[st[i]];
                  }
              MODIFY mx,smx,rem;
              mx.r=smx.r=-1;
              rem.c=-1;
              for(int i=1;i<=n;i++)
              {
                  if(!ch[i].size())
                      continue;
                  if(rem.c!=-1)
                  {
                      if(rem.r>=i)
                          ch[i].push_back(rem);
                      rem.c=-1;
                  }
                  sort(ch[i].begin(),ch[i].end(),[&](const MODIFY &u,const MODIFY &v){return u.r>v.r;});
                  for(auto [r,u,c]:ch[i])
                  {
                      MODIFY v={r,u,c};
                      if(v.r>mx.r)
                          swap(mx,v);
                      if(v.r>smx.r)
                          swap(smx,v);
                      if(mx.c==smx.c)
                          swap(v,smx);
                  }
                  for(auto [r,u,c]:ch[i])
                  {
                      MODIFY dir;
                      if(mx.c!=c)
                          dir=mx;
                      else if(smx.c!=c)
                          dir=smx;
                      else
                          dir.c=-1;
                      if(dir.c==-1||dir.r<i)
                          rem={r,u,c};
                      else
                      {
                          adj(u,dir.u);
                          rch[i].push_back({min(dir.r,r),u,c});
                          if(dir.r<r)
                              ch[dir.r+1].push_back({r,u,c});
                      }
                  }
              }
              vector<P> v;
       
              for(int i=1;i<=n;i++)
                  for(auto [r,u,c]:rch[i])
                      v.push_back({u.sd-u.fs});
              sort(v.begin(),v.end(),cmp);
       
              vector<int> ct(v.size());
              for(int i=1;i<=n;i++)
                  ch[i].clear();
              for(int i=1;i<=n;i++)
                  for(auto [r,u,c]:rch[i])
                  {
                      int p=lower_bound(v.begin(),v.end(),u.sd-u.fs,cmp)-v.begin();
                      ++ct[p];
                      ch[i].push_back({p+ct[p],u,c});
                      ch[r+1].push_back({-(p+ct[p]),u,c});
                  }
              m=1;
              while(m<v.size())
                  m<<=1;
              for(int i=1;i<=m*2-1;i++)
                  t[i].cnt=0,t[i].ok=1;
              for(int i=1;i<=n;i++)
              {
                  for(auto [r,u,c]:ch[i])
                  {
                      if(r>0)
                          modify(r,u);
                      else
                          modify(-r,{{0,0},{0,0}});
                  }
                  if(t[1].cnt<=1||(t[1].ok&&chk(t[1].rv,t[1].lv)))
                      cout<<1;
                  else
                      cout<<0;
              }
              cout<<"\n";
          }
       
      }
      

        

      M. V-Diagram

      #include <bits/stdc++.h>
      using namespace std;
      using i64 = int64_t;
      using f64 = double_t;
      int main() {
        cin.tie(nullptr)->sync_with_stdio(0);
        cout << fixed << setprecision(20);
        int t;
        cin >> t;
        for (int ti = 0; ti < t; ti += 1) {
          int n;
          cin >> n;
          vector<i64> a(n);
          for (i64& ai : a) { cin >> ai; }
          int m = min_element(a.begin(), a.end()) - a.begin();
          for (int i = 1; i < n; i += 1) { a[i] += a[i - 1]; }
          f64 ans = 0;
          ans = max(ans, (f64)a.back() / n);
          ans = max(ans, ((f64)a.back() - (m > 1 ? a[m - 2] : 0)) / (n - m + 1));
          ans = max(ans, (f64)a[m + 1] / (m + 2));
          cout << ans << "\n";
        }
      }
      

        

      posted @ 2024-02-25 20:07  Claris  閱讀(278)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲大尺度一区二区三区| 中文字幕精品人妻丝袜| 起碰免费公开97在线视频 | 婷婷综合缴情亚洲| 唐人社视频呦一区二区 | 亚洲综合国产一区二区三区| 欧美成人精品手机在线| 久久精品国产高潮国产夫妻| 亚洲另类无码一区二区三区| 小嫩模无套内谢第一次| 日韩一区二区三区理伦片| 国产不卡av一区二区| 久久人妻公开中文字幕| 国产AV无码专区亚洲AWWW| 成人亚洲狠狠一二三四区| 国产粉嫩美女一区二区三| 亚洲国产成人综合精品| 日韩精品久久久肉伦网站| 亚洲精品日本一区二区| 亚洲综合色成在线播放| 久青草视频在线免费观看| 亚欧洲乱码视频一二三区| 国产精品久久久久无码网站| 中文字幕无线码免费人妻| 亚洲国产精品综合久久20| 欧美黑人XXXX性高清版| 性色av 一区二区三区| 九九热在线观看精品视频| 亚洲av永久无码精品网站| 99国产欧美另类久久久精品| 2020国产欧洲精品网站| 激情一区二区三区成人文| 亚洲精品乱码久久久久久中文字幕| 无套内谢少妇一二三四| 少妇宾馆粉嫩10p| 野花社区www视频日本| 人妻丝袜AV中文系列先锋影音| 亚洲一区二区三区在线播放无码| 韩国无码AV片午夜福利| 久久精品中文字幕有码| 国产又色又爽又黄的|