zoukankan      html  css  js  c++  java
  • [考试反思]1001csp-s模拟测试(b):逃离

    如你所见,b组题,除了NC乱入直奔T2抢了我一个首杀以外A层学过FFT的人都没有参加。

    竞争压力很小,题又简单,所以就造就了6个AK。

    然而并不计入总分,我仍然稳在第二机房。

    T1lyl16分钟切掉我也是佩服,我没看数据范围打错复杂度(多了个二分)23分钟码完,T30。

    思路都不是很毒瘤,代码也很好打,加起来都没有2k。

    47分钟时干掉T3后我觉得差不多AK了,去厕所听到隔壁听讲FFT的声音,有些难过。

    回来之后打开题库翻看FFT的题目看了半个小时左右。

    然后自觉无聊,重新算了一下T1复杂度发现会被卡,改了。

    过了一会,教练叫我去隔壁听了一会讲。。。

    因为T1的失手导致了少听了33分钟的课。。。吸取教训

    一定要认真算好复杂度再开始打。

    T1:X国的军队

    考虑贪心并逆推。把b数组都减去a数组的量表示战后至少剩下多少人。

    考虑每个任务放进优先队列里,只要战后剩余人数足够就继续,否则就补人。

     1 #include<cstdio>
     2 #include<queue>
     3 using namespace std;
     4 priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
     5 int a[100005],b[100005];
     6 int read(){
     7     register int p=0;register char ch=getchar();
     8     while(ch>'9'||ch<'0')ch=getchar();
     9     while(ch<='9'&&ch>='0')p=(p<<3)+(p<<1)+ch-'0',ch=getchar();
    10     return p;
    11 }
    12 int main(){
    13     int t=read();
    14     while(t--){
    15         int n=read();long long tot=0,now=0,ex=0;
    16         for(int i=1;i<=n;++i)a[i]=read(),b[i]=read(),tot+=a[i],q.push(make_pair(b[i]-a[i],i));
    17         while(!q.empty()){
    18             int x=q.top().first;
    19             if(x>now)ex+=x-now,now=x;
    20             now+=a[q.top().second],q.pop();
    21         }
    22         printf("%lld
    ",ex+tot);
    23     }
    24 }
    View Code

    T2:排列组合

    考虑式子的实际含义,把每一项的第二个组合数改写一下就是$sumlimits_{i=0}^{n}C_n^i C_n^{n-i}$

    那么就是在2n个物品里选n个的全部可能。

    数组开2倍。肯定有人出锅了。

     1 #include<cstdio>
     2 #define int long long 
     3 #define mod 1000000007
     4 int fac[2000005],invv[2000005],inv[2000005];
     5 main(){
     6     int t,n;scanf("%lld",&t);
     7     inv[0]=inv[1]=invv[1]=fac[0]=fac[1]=1;
     8     for(int i=2;i<=2000000;++i)fac[i]=fac[i-1]*i%mod,invv[i]=mod-mod/i*invv[mod%i]%mod,inv[i]=inv[i-1]*invv[i]%mod*invv[i]%mod;
     9     while(t--)scanf("%lld",&n),printf("%lld
    ",fac[n<<1]*inv[n]%mod);
    10 }
    View Code

    T3:回文

    发现串长很小,准备乱搞。

    可以S2处理所有回文串。暴力即可。记录每一个回文串的两端点。

    每次询问就是求有多少个回文串左端点比L大右端点比R小。

    普通的二维偏序,值域只有5000*5000,树状数组解决。

     1 #include<cstdio>
     2 int l,t[5005][5005];char s[5005];
     3 void add(int x,int y){for(;x<=l;x+=x&-x)for(int j=y;j<=l;j+=j&-j)t[x][j]++;}
     4 int ask(int x,int y,int a=0){for(;x;x-=x&-x)for(int j=y;j;j-=j&-j)a+=t[x][j];return a;}
     5 int main(){
     6     scanf("%s",s+1);while(s[l+1])l++;
     7     for(int i=1;i<=l;++i)for(int j=0;j<i&&i+j<=l;++j)if(s[i-j]==s[i+j])add(l+1-(i-j),i+j);else break;
     8     for(int i=1;i<l;++i)for(int j=0;j<i&&i+j+1<=l;++j)if(s[i-j]==s[i+j+1])add(l+1-(i-j),i+j+1);else break;
     9     int t,L,R;scanf("%d",&t);while(t--)scanf("%d%d",&L,&R),printf("%d
    ",ask(l+1-L,R));
    10 }
    View Code
  • 相关阅读:
    bzoj 1176 cdq分治套树状数组
    Codeforces 669E cdq分治
    Codeforces 1101D 点分治
    Codeforces 1100E 拓扑排序
    Codeforces 1188D Make Equal DP
    Codeforces 1188A 构造
    Codeforces 1188B 式子转化
    Codeforces 1188C DP 鸽巢原理
    Codeforces 1179D 树形DP 斜率优化
    git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11615829.html
Copyright © 2011-2022 走看看