• 省选前模拟


     

    2020-01-31:

    T1:

    数位dp,首先有每次选最大的减去最优。

    T2:

    广义后缀自动机,建图搜索一遍建sam跑本质不同子串。

    T3:

    容斥dp,首先s值有log个,然后可以障碍之间转移。

    记录g[i][j]为至多,然后容斥转移。

    注意加入两个新点方便统计答案。

    T4:

    网络流原题,把行列拆开,

    跑最大流算出最多能删掉多少无用士兵。

     

    2020-01-31:

    T1:

    只有我不会做啊,首先转化题面,对于重复走的边,

    可以把它看做新的边,这样转化成欧拉回路。

    欧拉回路是所有的点度数都为偶数,考虑如何构造。

    先建一颗最小生成树,满足边权最小,dfs时遇到奇点,加一条到父亲的边即可。

    T2:

    暴力不太会写啊。

    每一个任务可以看作一个平行四边形,

    两个任务的平行四边形的并就是所有要完成的任务。

    接下来就是给这些格子编号,并且满足一个格点的上方和左上方的标号要小。

    然后用坐标变换转化成矩形,就是给定杨氏矩阵形状求个数。

    现在还没写出来。

    T3:

    说说dp好啦,要倒着dp。

    因为当前翻硬币后,下一个人可能会翻回来,所以倒着。

    定义dp[i][0/1]为在i轮前第i个硬币的状态。

    然后转移。注意开long long,没注意数据范围结果暴力一分没有。

    状态让人捉急,规划不好。

    写写时间表好好计划计划。

    2020-01-30:

    T1:

    拓扑dp。

    T2:

    首先字符集很小,这能联想到去枚举那个所用字符。

    然后可以利用哈希判断,这里的哈希就是维护桶的前缀和,

    然后以1为参照做差进制起来。

    一些细节,每次碰到一个没有标记的颜色,要清空哈希表。

     T3:

    正解是2-sat,不过可以随机化练练手。

    首先有一个伪了的贪心,复杂度O(n^2),然后发现n比较小,

    所以可以随即打乱n次。

     

    这次做的不算很好,先看到T2挺可做的,然后扎进去了,结果最后几个算法都伪了。

    然后一些低级错误,T3没看到多测,T2没写无解,丢掉30分。

    明天一定要认真。

     

    2020-01-18:

    题目不算太友好,但发现改题要简单些(除T1)

    T1:

    背包40pts

    skyh大神说一看暴力搜索减枝就很可做,

    正解不太会,先咕了。

    T2:

    给了一颗trie树,然后lcs是lca的深度-1

    然后广义后缀自动机就很应景,因为两个点的len就是lcp

    然后不知道怎么不枚举点集,坑掉了。

    正解为后缀自动机+线段树合并

    离正解差一个dfs序了,考虑一个parent_tree上的子树所有点的dfs序是连续的。

    然后考虑怎么得到这个子树所有点对lca上的最大深度。

    发现这个lca一定出自trie树上dfs序相邻的两个点,也就可以用线段树维护。

    合并取左区间的右端点和右区间的左端点的lca即可。

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<tr1/unordered_map>
      4 #define MAXN 510000
      5 using namespace std;
      6 inline int read(){
      7     int s=0,w=0;char ch=getchar();
      8     while(ch<'0'||ch>'9')w|=(ch=='-'),ch=getchar();
      9     while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
     10     return w?-s:s;
     11 }
     12 #define kd (read())
     13 struct rr{
     14     int nt,to;
     15 }bl[MAXN<<3];int hd[MAXN<<3],itot=0;
     16 inline void addedge(int fr,int to){
     17     bl[++itot]=(rr){hd[fr],to};hd[fr]=itot;
     18     return ;
     19 }
     20 int ans=0;
     21 int zf[MAXN];
     22 int L[MAXN],dfnum=0;
     23 int ys[MAXN];
     24 int sd[MAXN],f[MAXN][31],LOG[MAXN];
     25 int E[MAXN],etot=0,em[MAXN];
     26 int n;
     27 inline void init(){
     28     for(int i=1;i<=etot;++i)f[i][0]=E[i];
     29     for(int j=1;(1<<j)<=etot;++j)
     30         for(int i=1;i+(1<<j)-1<=etot;++i)
     31             f[i][j]=min(f[i][j-1],f[i+(1<<j-1)][j-1]);
     32     return ;
     33 }
     34 inline int LCA(int x,int y){
     35     if(em[x]>em[y])swap(x,y);
     36     int idx=LOG[em[y]-em[x]+1];
     37     return ys[min(f[em[x]][idx],f[em[y]-(1<<idx)+1][idx])];
     38 }
     39 namespace Segment{
     40     int root[MAXN<<1],num=0;
     41     int ls[(MAXN<<1)*50],rs[(MAXN<<1)*50];
     42     int lef[(MAXN<<1)*50],rig[(MAXN<<1)*50];
     43     int mxsd[(MAXN<<1)*50];
     44     inline void up(int u){
     45         lef[u]=MAXN+1,mxsd[u]=rig[u]=0;
     46         if(ls[u])
     47             mxsd[u]=max(mxsd[u],mxsd[ls[u]]),lef[u]=min(lef[u],lef[ls[u]]),rig[u]=max(rig[u],rig[ls[u]]);
     48         if(rs[u])
     49             mxsd[u]=max(mxsd[u],mxsd[rs[u]]),lef[u]=min(lef[u],lef[rs[u]]),rig[u]=max(rig[u],rig[rs[u]]);
     50         if(rig[ls[u]]!=0&&lef[rs[u]]!=MAXN+1)
     51             mxsd[u]=max(mxsd[u],sd[LCA(ys[rig[ls[u]]],ys[lef[rs[u]]])]-1);
     52         return ;
     53     }
     54     void insert(int &u,int l,int r,int pos){
     55         if(!u)u=++num;
     56         if(l==r){
     57             lef[u]=rig[u]=l;
     58             mxsd[u]=0;
     59             return ;
     60         }
     61         int mid=l+r>>1;
     62         if(pos<=mid)insert(ls[u],l,mid,pos);
     63         else insert(rs[u],mid+1,r,pos);
     64         return up(u),void();
     65     }
     66     int mergeTREE(int x,int y){
     67         if(!x||!y)return x+y;
     68         ls[x]=mergeTREE(ls[x],ls[y]);
     69         rs[x]=mergeTREE(rs[x],rs[y]);
     70         up(x);
     71         return x;
     72     }
     73 }
     74 using namespace Segment;
     75 namespace SAM{
     76     int yys[MAXN<<1];
     77     int len[MAXN<<1],fa[MAXN<<1];
     78     tr1::unordered_map<int ,int >son[MAXN<<1];
     79     int las=1,tcnt=1;
     80     inline void extend(int c,int id){
     81         int p=las,np=las=++tcnt;
     82         len[np]=len[p]+1;
     83         yys[np]=id;
     84         for(;p&&!son[p][c];p=fa[p])son[p][c]=np;
     85         if(!p)fa[np]=1;
     86         else{
     87             int q=son[p][c];
     88             if(len[q]==len[p]+1)fa[np]=q;
     89             else{
     90                 int nq=++tcnt;
     91                 fa[nq]=fa[q];
     92                 son[nq]=son[q];
     93                 len[nq]=len[p]+1;
     94                 fa[q]=fa[np]=nq;
     95                 for(;p&&son[p][c]==q;p=fa[p])son[p][c]=nq;
     96             }
     97         }
     98         return ;        
     99     }
    100     void Dfs(int u){
    101         if(yys[u])insert(root[u],1,dfnum,L[yys[u]]);
    102         bool ok=0;
    103         for(int i=hd[u];i;i=bl[i].nt)
    104             ok=1,Dfs(bl[i].to),root[u]=mergeTREE(root[u],root[bl[i].to]);
    105         if(ok)ans=max(ans,len[u]+mxsd[root[u]]);
    106         return ;
    107     }
    108 }
    109 using namespace SAM;
    110 void dfs(int u,int fat){
    111     L[u]=++dfnum;ys[dfnum]=u;
    112     if(u!=1)extend(zf[u],u);
    113     sd[u]=sd[fat]+1;
    114     int tmp=las;
    115     E[++etot]=L[u];em[u]=etot;
    116     for(int i=hd[u];i;i=bl[i].nt)
    117         las=tmp,dfs(bl[i].to,u),E[++etot]=L[u];
    118     return ;
    119 }
    120 int main(){
    121     //freopen("da.in","r",stdin);
    122     //freopen("2.out","w",stdout);
    123     n=kd;
    124     for(int i=2,x;i<=n;++i){
    125         x=kd,zf[i]=kd+1;
    126         addedge(x,i);
    127     }
    128     for(int i=2;i<=(n<<1);++i)LOG[i]=LOG[i>>1]+1;
    129     dfs(1,0);
    130     init();
    131     itot=0;for(int i=1;i<=n;++i)hd[i]=0;
    132     for(int i=1;i<=tcnt;++i)
    133         if(fa[i])addedge(fa[i],i);
    134     Dfs(1);
    135     printf("%d
    ",ans);
    136     return 0;
    137 }
    138 /*
    139 7
    140 1 1
    141 1 2
    142 2 1
    143 2 2
    144 5 1
    145 5 2
    146 
    147 */
    View Code

    dfs版的广义可能会被卡成$O(n^2)$

    当然现在打的板子也不太正确,正确的貌似要特判一些东西,现在暂时鸽掉了。

    T3:

    %%Dybala大神

    这种平衡树的用法貌似很常见,记得原来某次的差分表。

    考场暴力没写,主要是康到题比较迷。

    一直在想怎么构造一种赋值方法来代替那个递归比较,不太可行。

    考虑动态地维护序列的有序。

    把每个元素写成pair,即合并的两个原集合编号。

    可以二分插入的位置,

    首先在插入x时已经有序,也就是说前面所有集合的大小关系已经有了。

    那么每次直接splay查询rank那么就可以判断是否能将x插在mid后面。

    最后插入好后再询问rank便可。

    注意相同的元素用并查集特判一下。

      1 #include<cstdio>
      2 #include<iostream>
      3 #define MAXN 51000
      4 using namespace std;
      5 #define mkp(x,y) make_pair(x,y)
      6 #define fi first
      7 #define se second
      8 namespace Splay{
      9     int par[MAXN],ch[MAXN][2],sz[MAXN],val[MAXN];
     10     int num=0,root=0;
     11     #define lc (ch[x][0])
     12     #define rc (ch[x][1])
     13     inline bool chk(int x){
     14         return ch[par[x]][1]==x;
     15     }
     16     inline void up(int x){
     17         sz[x]=sz[lc]+sz[rc]+1;
     18         return ;
     19     }
     20     inline void rotate(int x){
     21         int y=par[x],z=par[y],k=chk(x),w=ch[x][k^1];
     22         if(z)ch[z][chk(y)]=x;
     23         ch[x][k^1]=y,ch[y][k]=w;
     24         if(w)par[w]=y;
     25         par[y]=x,par[x]=z;
     26         return up(y),up(x),void();
     27     }
     28     inline void splay(int x){
     29         int y=0,z=0;
     30         while(par[x]){
     31             y=par[x],z=par[y];
     32             if(z)rotate(chk(x)==chk(y)?y:x);
     33             rotate(x);
     34         }
     35         root=x;
     36         return ;
     37     }
     38     inline void makeroot(int k){
     39         int x=root;
     40         while(1){
     41             if(sz[lc]>=k)
     42                 x=lc;
     43             else if(sz[lc]+1<k)
     44                 k-=sz[lc]+1,x=rc;
     45             else break;
     46         }
     47         splay(x);
     48         return ;
     49     }
     50     inline int rk(int x){
     51         splay(x);
     52         return sz[lc]+1;
     53     }
     54 }
     55 using namespace Splay;
     56 int fat[MAXN];
     57 inline int find(int x){
     58     if(fat[x]==x||!fat[x])return x;
     59     return fat[x]=find(fat[x]);
     60 }
     61 pair<int ,int >w[MAXN];
     62 int ys[MAXN];
     63 inline bool cmp(pair<int ,int >a,pair<int ,int >b){//a<=b
     64     if(find(a.fi)==find(b.fi)){
     65         if(find(a.se)==find(b.se))return true;
     66         return rk(ys[a.se])<rk(ys[b.se]);
     67     }else return rk(ys[a.fi])<rk(ys[b.fi]);
     68 }
     69 int n;
     70 int main(){
     71     //freopen("da.in","r",stdin);
     72     //freopen("3.out","w",stdout);
     73     scanf("%d",&n);
     74     w[1]=mkp(1,1),ys[1]=val[1]=1,sz[1]=1;
     75     w[n+2]=mkp(n+2,n+2),ys[n+2]=2,val[2]=n+2,sz[2]=2;
     76     par[1]=2,ch[2][0]=1;
     77     num=root=2;
     78     for(int i=2,u,v;i<=n+1;++i){
     79         scanf("%d%d",&u,&v);
     80         ++u,++v;
     81         w[i]=mkp(u,v);
     82         int l=1,r=i;
     83         int pos=0;
     84         while(r-l>1){
     85             int mid=l+r>>1;
     86              makeroot(mid);
     87              if(cmp(w[val[root]],w[i]))l=mid;
     88              else r=mid;
     89         }
     90         makeroot(r);
     91         if(cmp(w[val[root]],w[i]))pos=r;
     92         else pos=l;
     93         makeroot(pos);
     94         ys[i]=++num;val[num]=i;
     95         if(find(w[i].fi)==find(w[val[root]].fi)&&find(w[i].se)==find(w[val[root]].se))
     96             fat[find(i)]=find(val[root]);
     97         int x=ch[root][1],p=root;
     98         while(x)p=x,x=lc;
     99         x=num;par[x]=p;
    100         lc=rc=0;sz[x]=1;
    101         p==root?ch[p][1]=x:ch[p][0]=x;
    102         printf("%d
    ",rk(num));
    103     }
    104     return 0;
    105 }
    View Code

    初始化要完全。

     

    2020-01-17:

    T1:

    由原题换成思博题,反复斟酌了一下生物链的定义以防滑天下之大稽

    T2:

    果然还是读错了题,以为task3是链数据还在想怎么这么水

    暴力跳链动态修改$dp$有85pts,全场就我一个没打趴。

    正解是DDP,还在学。

    T3:

    由于IOI赛制和spj,还是比较好van的,

    然而概率期望一些基础的东西还是不掌握

    目前已解决6个task,qj到70分。。。

    Task1:等差数列

    Task2:化下柿子,然后快速幂

    Task3:

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 int data[11]={0,1,10,100,1024,10000,20000,50000,100000,524288,1000000};
      4 namespace run1{
      5     void Main(int x){
      6         long double ans=0;
      7         ans=(x+1.0)*0.5;
      8         printf("%.10Lf
    ",ans);
      9         return ;
     10     }
     11 }
     12 namespace run2{
     13     inline long double qpow(long double a,int b){
     14         long double res=1.0L;
     15         for(;b;b>>=1,a=a*a)
     16             if(b&1)res=res*a;
     17         return res;
     18     }
     19     void Main(int x){
     20         long double ans=0;
     21         long double lim=(1e6);
     22         for(int i=1;i<=(int)(1e6);++i)
     23             ans+=qpow(i/lim,x);
     24         printf("%.10Lf
    ",ans);
     25         return ;
     26     }
     27 }
     28 namespace run3{
     29     void Main(int x){
     30         long double ans=0;
     31         for(int i=1;i<=x;++i)ans+=(double)x/(double)i;
     32         printf("%.10Lf
    ",ans);
     33         return ;
     34     }
     35 }
     36 namespace run4{
     37     void Main(int x){
     38         long double ans=0,base=1.0L/(long double)x;
     39         for(int i=2;i<=x+1;++i){
     40             ans+=(long double)i*base*(i-1);
     41             base=base*(x-i+1.0L)/(x*1.0L);
     42         }
     43         printf("%.10Lf
    ",ans);
     44         return ;
     45     }
     46 }
     47 namespace run5{
     48     void Get_ans(int u,int l,int r,long long duo,long double &ans,int lim){
     49         for(int i=l;i<=r;++i)ans+=(lim-i+1LL);
     50         ans+=(l-1LL)*(lim-l+1LL);
     51         ans-=duo;
     52         if(l==r)return ;
     53         int mid=l+r>>1;
     54         Get_ans(u<<1,l,mid,l*(lim-r+1LL),ans,lim),
     55         Get_ans(u<<1|1,mid+1,r,l*(lim-r+1LL),ans,lim);
     56         return ;
     57     }
     58     void Main(int x){
     59         long double ans=0;
     60         Get_ans(1,1,x,0,ans,x);
     61         ans=ans/(long double)x/(long double)(x+1.0L)*2.0;
     62         printf("%.10Lf
    ",ans);
     63         return ;
     64     }
     65 }
     66 namespace run6{
     67     long double dp[1000001];
     68     void Main(int n){
     69         long double sm=0;
     70         for(int i=1;i<=n;++i){
     71             dp[i]=2.0L*sm;
     72             dp[i]=dp[i]/(long double)i+i;
     73             sm+=dp[i];
     74         }
     75         printf("%.10Lf
    ",dp[n]);
     76         return ;
     77     }
     78 }
     79 namespace run7{
     80     
     81     void Main(int n){
     82         
     83         return ;
     84     }
     85 }
     86 int main(){
     87     for(int i=1;i<=10;++i)
     88         run7::Main(data[i]);
     89     return 0;
     90 }
     91 /*
     92 function randint(a, b) {
     93     return a + Math.floor(Math.random() * (b - a + 1))
     94 }
     95 
     96 function randper(n) {
     97     var a, p
     98     a = []
     99     for (i = 1; i <= n; i = i + 1) {
    100         p = randint(1, i)
    101         a[i] = a[p]
    102         a[p] = i
    103     }
    104     return a
    105 }
    106 
    107 data = [1, 10, 100, 1024, 10000, 20000, 50000, 100000, 524288, 1000000]
    108 
    109 function run1(n) {
    110     return randint(1, n)
    111 }
    112 
    113 function run2(n) {
    114     var res, i, x
    115     res = 1000000
    116     for (i = 1; i <= n; i = i + 1) {
    117         x = randint(1, 1000000)
    118         if (x < res) {
    119             res = x
    120         }
    121     }
    122     return res
    123 }
    124 
    125 function run3(n) {
    126     var cnt, used , book , x, i
    127     cnt = 0
    128     used = 0
    129     book = []
    130     for (i = 1; i <= n; i = i + 1) {
    131         book[i] = false
    132     }
    133     while (true) {
    134         cnt = cnt + 1
    135         x = randint(1, n)
    136         if (book[x] == false) {
    137             book[x] = true
    138             used = used + 1
    139             if (used == n) {
    140                 return cnt
    141             }
    142         }
    143     }
    144 }
    145 
    146 function run4(n) {
    147     var cnt, book , x, i
    148     cnt = 0
    149     book = []
    150     for (i = 1; i <= n; i = i + 1) {
    151         book[i] = false
    152     }
    153     while (true) {
    154         cnt = cnt + 1
    155         x = randint(1, n)
    156         if (book[x]) {
    157             return cnt
    158         }
    159         book[x] = true
    160     }
    161 }
    162 
    163 function run5(n) {
    164     var qL, qR, res
    165     while (true) {
    166         qL = randint(1, n)
    167         qR = randint(1, n)
    168         if (qL <= qR) {
    169             break
    170         }
    171     }
    172     res = 0
    173     function seg_query(pL, pR) {
    174         var pM
    175         pM = Math.floor((pL + pR) / 2)
    176         res = res + 1
    177         if (qL <= pL && pR <= qR) {
    178             return
    179         }
    180         if (qL <= pM) {
    181             seg_query(pL, pM)
    182         }
    183         if (pM < qR) {
    184             seg_query(pM + 1, pR)
    185         }
    186         return
    187     }
    188 
    189     seg_query(1, n)
    190     return res
    191 }
    192 
    193 function run6(n) {
    194     var lc, rc, pri, a, root , i, res
    195     root = 0
    196     lc = []
    197     rc = []
    198     pri = randper(n)
    199     a = randper(n)
    200     function treap_insert(p, q) {
    201         var z
    202         if (p == 0) {
    203             lc[q] = 0
    204             rc[q] = 0
    205             return q
    206         }
    207         if (a[q] < a[p]) {
    208             lc[p] = treap_insert(lc[p], q)
    209             if (pri[lc[p]] < pri[p]) {
    210                 z = lc[p]
    211                 lc[p] = rc[z]
    212                 rc[z] = p
    213                 p = z
    214             }
    215         } else {
    216             rc[p] = treap_insert(rc[p], q)
    217             if (pri[rc[p]] < pri[p]) {
    218                 z = rc[p]
    219                 rc[p] = lc[z]
    220                 lc[z] = p
    221                 p = z
    222             }
    223         }
    224         return p
    225     }
    226     for (i = 1; i <= n; i = i + 1) {
    227         root = treap_insert(root , i)
    228     }
    229     res = 0
    230     function dfs(p, d) {
    231         res = res + d
    232         if (lc[p]) {
    233             dfs(lc[p], d + 1)
    234         }
    235         if (rc[p]) {
    236             dfs(rc[p], d + 1)
    237         }
    238     }
    239     dfs(root , 1)
    240     return res
    241 }
    242 function run7(n) {
    243     var tab, s, m, l, i, j, res
    244     m = 100003
    245     l = 5
    246     tab = []
    247     for (i = 0; i < m; i = i + 1) {
    248         tab[i] = []
    249     }
    250     function sequal(s1, s2) {
    251         var i
    252         if (s1.length != s2.length) {
    253             return false
    254         }
    255         for (i = 0; i < s1.length; i = i + 1) {
    256             if (s1[i] != s2[i]) {
    257                 return false
    258             }
    259         }
    260         return true
    261     }
    262     res = 0
    263     function insert(s) {
    264         var i, h
    265         h = 0
    266         for (i = 0; i < l; i = i + 1) {
    267             h = (h * 31 + s[i]) % 1000000007
    268         }
    269         h %= m
    270         for (i = 0; i < tab[h].length; i = i + 1) {
    271             res = res + 1
    272             if (sequal(tab[h][i], s)) {
    273                 return
    274             }
    275         }
    276         res = res + 1
    277         tab[h][tab[h].length] = s
    278     }
    279     for (i = 0; i < n; i = i + 1) {
    280         s = []
    281         for (j = 0; j < l; j = j + 1) {
    282             s[j] = randint(0, 25)
    283         }
    284         insert(s)
    285     }
    286     return res
    287 }
    288 function run8(n) {
    289     var a, b, i, x, res
    290     a = []
    291     for (i = 1; i <= n; i = i + 1) {
    292         a[i] = false
    293     }
    294     res = 0
    295     while (true) {
    296         b = []
    297         for (i = 1; i <= n; i = i + 1) {
    298             if (a[i] == false) {
    299                 b[b.length] = i
    300             }
    301         }
    302         if (b.length == 0) {
    303             break
    304         }
    305         res = res + 1
    306         x = b[randint(0, b.length - 1)]
    307         for (i = x; i <= n; i = i + x) {
    308             a[i] = true
    309         }
    310     }
    311     return res
    312 }
    313 function run9(n) {
    314     var f, i, j, res
    315     a = []
    316     for (i = 1; i <= n; i = i + 1) {
    317         a[i] = randint(1, 10)
    318     }
    319     res = 0
    320     f = []
    321     for (i = 1; i <= n; i = i + 1) {
    322         f[i] = 1
    323         for (j = 1; j < i; j = j + 1) {
    324             if (a[j] < a[i] && f[j] + 1 > f[i]) {
    325                 f[i] = f[j] + 1
    326             }
    327         }
    328         if (f[i] > res) {
    329             res = f[i]
    330         }
    331     }
    332     return res
    333 }
    334 function run10(n) {
    335     var x, i, res
    336     x = 0
    337     res = 0
    338     for (i = 1; i <= n; i = i + 1) {
    339         if (randint(1, 100000) != 1) {
    340             x = x + 1
    341         } else {
    342             x = 0
    343         }
    344         if (x > res) {
    345             res = x
    346         }
    347     }
    348     return res
    349 }
    350 */
    View Code

     

     

     

    2020-01-16:

    T3:

    task1:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MN=100000;
     4 //int a[MN+5],b[MN+5],c[MN+5];
     5 void build_1()
     6 {
     7     int n=1000000000,x=233;
     8     
     9     //ofstream A("npio1.in");
    10     
    11     //A << n << endl;
    12     
    13     for(int i=1;i<=n;++i)
    14     {
    15         x=(37*x+666)%19260817;
    16         //A << x%10000 << ' ';
    17     }
    18     //A << endl;
    19     cout<<x<<endl;
    20     for(int i=1;i<=n;++i)
    21     {
    22         x=(37*x+666)%19260817;
    23         //A << x%10000 << ' ';
    24     }
    25     //A << endl;
    26 }
    27 const int mod=1e9+7;
    28 int main()
    29 {
    30     //build_1();
    31     int x=233,y=11703104;
    32     int res=0;
    33     for(int i=1;i<=1000000000;++i){
    34         x=(37*x+666)%19260817;
    35         y=(37*y+666)%19260817;
    36         res=((233LL*res)^(x%10000+y%10000))%mod;
    37     }
    38     cout<<res<<endl;
    39 }
    View Code

    task2:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MAXN=16777217;
     4 const int mod=1e9+7;
     5 const long double PI=acos(-1.0L);
     6 struct Cp{
     7     long double x,y;
     8     Cp(long double _x=0,long double _y=0){x=_x,y=_y;return ; }
     9     friend Cp operator +(Cp a,Cp b){return Cp(a.x+b.x,a.y+b.y); }
    10     friend Cp operator -(Cp a,Cp b){return Cp(a.x-b.x,a.y-b.y); }
    11     friend Cp operator *(Cp a,Cp b){return Cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x); }
    12 }a[MAXN],b[MAXN],omg1[MAXN],omg2[MAXN];
    13 int ys[MAXN];
    14 inline void init(const int &lim){
    15     for(int i=1;i<lim;i<<=1)
    16         for(int k=0;k<i;++k)
    17             omg1[i+k]=Cp(cos(PI*k/i),sin(PI*k/i));
    18     return ;
    19 }
    20 inline void FFT(Cp *x,const int &lim,const int &type){
    21     for(int i=0;i<lim;++i)if(ys[i]<i)swap(x[i],x[ys[i]]);
    22     for(int i=1;i<lim;i<<=1){
    23         const int delta=i<<1;
    24         for(int j=0;j<lim;j+=delta){
    25             for(int k=0;k<i;++k){
    26                 Cp t1=x[j+k],t2=omg1[i+k]*x[i+j+k];
    27                 x[j+k]=t1+t2,x[i+j+k]=t1-t2;
    28             }
    29         }
    30     }
    31     if(type==-1){
    32         reverse(x+1,x+lim);
    33         for(int i=0;i<lim;++i)
    34             x[i].x=((long long)(x[i].x/lim+0.5))%998244353;
    35     }
    36     return ;
    37 }
    38 int main(){
    39     
    40     int n=5000000,x=23333;
    41     
    42     for(int i=1;i<=n;++i)
    43     {
    44         x=(233*x+37)&32767;
    45         a[i].x=x;
    46     }
    47     
    48     for(int i=1;i<=n;++i)
    49     {
    50         x=(233*x+37)&32767;
    51         b[i-1].x=x;
    52     }
    53     
    54     int lim=16777216,L=23;
    55     for(int i=0;i<lim;++i)
    56         ys[i]=(ys[i>>1]>>1)|((i&1)<<L);
    57     init(lim);
    58     
    59     FFT(b,lim,1);FFT(a,lim,1);
    60     for(int i=0;i<lim;++i)a[i]=a[i]*b[i];
    61     FFT(a,lim,-1);
    62     
    63     int res=0;
    64     for(int i=1;i<=n;++i)
    65         res=((233LL*res)^((long long)a[i].x))%mod;
    66     cout<<res<<endl;
    67     
    68     /*int n;
    69     cin>>n;
    70     for(int i=1;i<=n;++i)scanf("%Lf",&a[i].x);
    71     for(int i=1;i<=n;++i)scanf("%Lf",&b[i].x);
    72     int lim=1,L=-1;
    73     for(;lim<n*2+1;lim<<=1,++L);
    74     for(int i=0;i<lim;++i)
    75         ys[i]=(ys[i>>1]>>1)|((i&1)<<L);
    76     init(lim);
    77     FFT(a,lim,1);FFT(b,lim,1);
    78     for(int i=0;i<lim;++i)a[i]=a[i]*b[i];
    79     FFT(a,lim,-1);
    80     for(int i=0;i<lim;++i)cout<<a[i].x<<" ";
    81     cout<<endl;*/
    82     
    83     return 0;
    84 }
    View Code

    task3:

     1 #include<bits/stdc++.h>
     2 #define int long long
     3 using namespace std;
     4 const int MN=100000;
     5 const int MOD=998244353;
     6 int a[302767],b[302767];
     7 int f[302767],g[302767];
     8 signed main()
     9 {
    10     //freopen("3.out","w",stdout);
    11     int n=1000000000,x=23333,y=29989;
    12     
    13     
    14     for(int i=1;i<=302766;++i)
    15     {
    16         x=(233*x+37)&32767;
    17         y=(233*y+37)&32767;
    18         a[i-1]=x,b[i-1]=y;
    19     }
    20     
    21     for(int i=0;i<=32768;++i)
    22         for(int j=0;j<=32768;++j)
    23             f[i]=(f[i]+(long long)a[i-j]*b[j]%MOD)%MOD;
    24     for(int i=0;i<=32768;++i)
    25         for(int j=0;j<32768;++j)
    26             g[i]=(g[i]+(long long)a[j]*b[i-j+32768]%MOD)%MOD;
    27     int res=0;
    28     for(int i=0;i<32768;++i)
    29         res=((233LL*res)^f[i])%1000000007;
    30     for(int i=32768;i<n;++i){
    31         int idx=i%32768;
    32         f[idx]=(f[idx]+g[idx])%1000000007;
    33         //cout<<f[idx]<<" "<<f[i]<<endl;
    34         res=((233LL*res)^f[idx])%1000000007;
    35     }
    36     cout<<res<<endl;
    37 }
    View Code

    task4:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MN=100000;
     4 char ton[1000000000];
     5 void build_4()
     6 {
     7     int n=1000000000;
     8     unsigned int x=23333;
     9     
    10     //ofstream A("npio4.in");
    11     
    12     //A << n << endl;
    13     
    14     for(int i=1;i<=n;++i)
    15     {
    16         x=x^(x<<13);
    17         x=x^(x>>17);
    18         x=x^(x<<5);
    19         ++ton[x%1000000000];
    20         //A << x%1000000000 << ' ';
    21     }
    22     //A << endl;
    23 }
    24 const int mod=1e9+7;
    25 int main()
    26 {
    27     build_4();
    28     int res=0;
    29     for(int i=0;i<1000000000;++i)
    30         while(ton[i]){
    31             res=((233LL*res)^i)%mod;
    32             --ton[i];
    33         }
    34     cout<<res<<endl;
    35 }
    View Code

    task5:

     1 #include<bits/stdc++.h>
     2 #define LL long long
     3 using namespace std;
     4 const LL inv=534566745;
     5 const LL mod=(1LL<<32);
     6 int n=1000000000;
     7 short sz[1000000001];
     8 int ssz[270000001];
     9 int main()
    10 {
    11     freopen("55.out","w",stdout);
    12     /*int n,x,y;
    13     scanf("%d",&n);
    14     for(int i=1;i<n;++i)
    15     {
    16         scanf("%d%d",&x,&y);
    17         v[x].push_back(y);
    18         v[y].push_back(x);
    19     }
    20     dfs(1,0);
    21     printf("%d
    ",n);
    22     for(int i=1;i<=n;++i)printf("%d ",size[i]);*/
    23     
    24     //ofstream A("npio5.in");
    25     
    26     //A << n << endl;
    27     long long x=493989120;
    28     
    29     for(int i=n;i>=1;--i)
    30     {
    31         int sszz=0;
    32         if(i<=270000000)sszz=++ssz[i];
    33         else sszz=(int)(++sz[i]);
    34         if(i<=25000000)cout<<i<<" "<<ssz[i]<<endl;
    35         if(i==1)break;
    36         //cout<<i<<" "<<x<<endl;
    37         int fat=x%(i-1)+1;
    38         //cout<<fat<<endl;
    39         if(fat<=270000000){
    40             ssz[fat]+=sszz;
    41         }else{
    42             sz[fat]+=sszz;
    43         }
    44         x=(x-37+mod)%mod*inv%mod;
    45         //A << x%i+1 << ' ' << i+1 << endl;
    46     }
    47     int res=0;
    48     for(int i=1;i<=n;++i){
    49         if(i<=270000000){
    50             res=((233LL*res)^ssz[i])%1000000007;
    51         }else{
    52             res=((233LL*res)^((int)sz[i]))%1000000007;
    53             //cout<<(int)sz[i]<<endl;
    54         }
    55     }
    56     cout<<sz[1]<<" "<<res<<endl;
    57 }
    58 //427390545
    View Code

    task6:

     1 #include<bits/stdc++.h>
     2 #define LL long long
     3 using namespace std;
     4 const int mod=1e9+7;
     5 const int n=1000000000;
     6 int main()
     7 {
     8     unsigned int x=23333,y,w=233;
     9 
    10     LL ans=0;
    11     for(int i=1;i<n;++i)
    12     {
    13         x=233*x+37;
    14         w=(23*w+37)&32767;
    15         ans+=w;
    16     }
    17     x=233*x+37;
    18     y=233*x+37;
    19     w=(23*w+37)&32767;
    20     ans+=w;
    21     for(int i=32321;i<=32321;++i){
    22         long long an=ans-i;
    23         int res=0;
    24         for(int i=0;i<4;++i)
    25         {
    26             res=((233LL*res)^(an%10000))%mod;
    27             an/=10000;
    28         }
    29         cout<<i<<" "<<res<<endl;
    30     }
    31 }
    View Code

    task7:

     1 #include<cstdio>
     2 #include<queue>
     3 using namespace std;
     4 const int MN=100000;
     5 priority_queue<int> Q;
     6 int ans[MN+5];
     7 int main()
     8 {
     9     int n,op,x;
    10     scanf("%d",&n);
    11     for(int i=1;i<=n;++i)
    12     {
    13         scanf("%d",&op);
    14         if(op==1)
    15         {
    16             scanf("%d",&x);
    17             Q.push(x);
    18         }
    19         if(op==2)Q.pop();
    20         ans[i]=Q.top();
    21     }
    22     printf("%d
    ",n);
    23     const int MOD=1000000009;
    24     for(int i=1;i<=n;++i)printf("%d ",(ans[i]%MOD+MOD)%MOD);
    25 }
    View Code

    task8:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int mod=1e9+7;
     4 char ton[1000000000];
     5 int main()
     6 {
     7     int n=1000000000;
     8     unsigned int x=23333;
     9     
    10     int res=0;
    11     x=233*x+37;
    12     int pos=x%1000000000;
    13     ++ton[pos];
    14     int cnt=0;
    15     res=((233LL*res)^pos)%mod;
    16     //cout<<"i=1 "<<pos<<" "<<pos<<endl;
    17     for(int i=2;i<=n;++i)
    18     {
    19         x=233*x+37;
    20         int idx=x%1000000000;
    21         
    22         ++ton[idx];
    23         if(idx<pos)++cnt;
    24         //cout<<idx<<endl;
    25         //cout<<cnt+ton[pos]<<" "<<i+1<<" "<<((i+1)/2)<<endl;
    26         while(cnt+ton[pos]<(i+1)/2)cnt+=ton[pos++];
    27         //cout<<"qwq"<<endl;
    28         while(cnt>(i+1)/2-1)cnt-=ton[--pos];
    29         
    30         //cout<<"i="<<i<<" "<<idx<<" "<<pos<<endl;
    31         res=((233LL*res)^pos)%mod;
    32     }
    33     
    34     cout<<res<<endl;
    35 }
    View Code

    task9:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int mod=1e9+7;
     4 bitset<1000000000>ton;
     5 int main()
     6 {
     7     const int n=1000000000,MX=1000000000;
     8     unsigned int x=23333;
     9     int cnt=0;
    10     int res=0;
    11     cout<<"qwq"<<endl;
    12     for(int i=1;i<=n;++i)
    13     {
    14         x=233*x+37;
    15         if(!ton[x%MX])++cnt;
    16         ton[x%MX]=1;
    17         res=((233LL*res)^cnt)%mod;
    18     }
    19     cout<<res<<endl;
    20 }
    View Code

    task10:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MN=100000;
     4 vector< pair<int,int> > v[MN+5];
     5 vector<int> ans;
     6 stack<int> S;
     7 int dfn[MN+5],low[MN+5],cnt;
     8 void tarjan(int x,int from)
     9 {
    10     dfn[x]=low[x]=++cnt;
    11     S.push(x);
    12     for(int i=0;i<v[x].size();++i)if(v[x][i].second!=from)
    13     {
    14         int y=v[x][i].first;
    15         if(!dfn[y])
    16         {
    17             tarjan(y,v[x][i].second);
    18             low[x]=min(low[x],low[y]);
    19             if(low[y]>=dfn[x])
    20             {
    21                 int res=(x+y)%998244353;
    22                 while(S.top()!=y)
    23                 {
    24                     res=(res+S.top())%998244353;
    25                     S.pop();
    26                 }
    27                 S.pop();
    28                 ans.push_back(res);
    29             }
    30         }
    31         else low[x]=min(low[x],dfn[y]);
    32     }
    33 }
    34 int main()
    35 {
    36     /*int n,m,x,y;
    37     scanf("%d%d",&n,&m);
    38     for(int i=1;i<=m;++i)
    39     {
    40         scanf("%d%d",&x,&y);
    41         v[x].push_back(make_pair(y,i));
    42         v[y].push_back(make_pair(x,i));
    43     }
    44     for(int i=1;i<=n;++i)if(!dfn[i])tarjan(i,0);
    45     sort(ans.begin(),ans.end());
    46     printf("%d
    ",ans.size());
    47     for(int i=0;i<ans.size();++i)printf("%d ",ans[i]);*/
    48     long long an1=5000000LL*5000000LL%998244353,an2=5000001LL*5000000LL%998244353;
    49     cout<<(((233LL*an1)^an2)%1000000007)<<endl;
    50 }
    View Code

     

     

    2020-01-02:

    凭实力抱0,就没什么好说的。

    T1的式子推错,但没有拍。T2数组开小,可能最近时间逐渐膨胀,已经忘记了自己渣渣的本质了。

    T1:

    刚开始推了错误的柿子,将序列按题意分成三部分用隔板法。

    然后其实第一部分隔板显然是错的,因为不像第二部分钦定每个已经选了$A_i$个就消除影响了。

    第一部分先钦定所有都选了$A_i$,在考虑把减的分配,但不能保证减的<=$A_i$。

    过了样例没多想,太大意了。

    正解对第一部分奇加偶减容斥,还是套用先选够的思想,但这里是至少有多少个不合法,二进制枚举(所以$n1$<=8)。

    因为模数,去学了波$exlucas$。

     1 inline LL fac(int n,const int &pi,const int &pk){
     2         if(!n)return 1LL;
     3         LL res=1LL;
     4         for(int i=2;i<=pk;++i)if(i%pi)res=res*i%pk;
     5         res=qpow(res,n/pk,pk);
     6         for(int i=2;i<=n%pk;++i)if(i%pi)res=res*i%pk;
     7         return res*fac(n/pi,pi,pk)%pk;
     8     }
     9     inline LL CRT(int ai,int mi,const int &Mod){
    10         return ai*(Mod/mi)%Mod*qpow(Mod/mi,phi(Mod)-1,Mod)%Mod;
    11     }
    12     inline LL C(int n,int m,int pi,int pk){
    13         LL fz=fac(n,pi,pk),fm1=fac(m,pi,pk),fm2=fac(n-m,pi,pk);
    14         int k=0;
    15         for(int i=n;i;i/=pi)k+=i/pi;
    16         for(int i=m;i;i/=pi)k-=i/pi;
    17         for(int i=n-m;i;i/=pi)k-=i/pi;
    18         return fz*qpow(fm1,phi(pk)-1,pk)%pk*qpow(fm2,phi(pk)-1,pk)%pk*qpow(pi,k,pk)%pk;
    19     }
    20     inline LL exlucas(int n,int m,const int &Mod){
    21         if(n<m)return 0;
    22         if(!m)return 1;
    23         LL res=0,tmp=Mod;
    24         for(int i=2;i<=sqrt(Mod);++i)
    25             if(tmp%i==0){
    26                 int pk=1;
    27                 while(tmp%i==0)tmp/=i,pk*=i;
    28                 res=(res+CRT(C(n,m,i,pk),pk,Mod))%Mod;
    29             }
    30         if(tmp>1)res=(res+CRT(C(n,m,tmp,tmp),tmp,Mod))%Mod;
    31         return res%Mod;
    32     }
    板子

    实现过程是把模数分解质因子,求出每个$C_{n}^{m} equiv a (mod P^{k})$的$a$,然后$CRT$合并。

    然后利用$frac{frac{n!}{P^{x}}}{frac{m!}{P^{y}}*frac{(n-m)!}{P^{z}}}*P^{x-y-z} equiv a(mod P^{k})$的形式。

    把所有阶乘的$P$提出来,使互质可求逆元,求阶乘提质因子是递归过程,根据化的式子搞循环节,具体网上证明比较清晰。

    单次求$a$的时间复杂度为$log_P$,如果调用次数多,预处理记忆化一些数组即可。

    T2:

    $FWT$的题,$FFT$时并没有写过题,全忘了。

    注意变化值求一个点值数组。

    or,and都是对于每个分治区间最高位影响。xor不会证。dalao的博客

    考虑点值具有结合率和交换率。

    所以第$2^{i}$行的点值就是第$2^{i-1}$的点值相乘。

    要的答案为$sum_{i=0}^{p}{x^{i}}$,可以倍增搞定$p$。

    $f[x][i]=sumlimits_{j=0}^{2^i-1} x^{2^j}$

    $f[x][i]=f[x][i-1]+f[x^{2^{2^{i-1}}}][i-1]$

    因为$f[x][i]$定义左闭右开,所以$P++$

    T3:

    对于状态$b$,状态$a_i$都可以转移,$g_i$为$a_i$的全局概率。

    期望逆推可以直接$sum {a_i}$

    正推是$frac{sum g_{i}*a_{i}}{sum g_{i}}$

    不会证。

    因为一个区间$[l,r]$可以分成$[l,k],[k+1,r]$,其中$s[k]=='O'$,所以具有子结构。

    然后计忆化搜索,颓的代码。。。

    dp[i][0]=max(dp[i+1][0],dp[i+1][1])+S[i];
    			dp[i][1]=max(dp[i+1][0],dp[i+1][1]+S[i]);
  • 相关阅读:
    ElasticSearch-03-远行、停止
    ElasticSearch-02-elasticsearch.yaml
    Go-31-杂序
    Go-30-main包
    SpringBoot 初入门
    Spring 事务管理
    JDBC Template
    Spring 基于 AspectJ 的 AOP 开发
    Spring AOP 代理
    Spring 的 AOP 概述和底层实现
  • 原文地址:https://www.cnblogs.com/2018hzoicyf/p/12144020.html
Copyright © 2020-2023  润新知