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
  • 相关阅读:
    win10 ubuntu 双系统启动顺序设置
    关于memset的使用
    POJ 2533 最小上升子序列
    Did Pong Lie? (差分系统 判负环)
    HDU 5828 Rikka with Sequence(线段树 开根号)
    SCU
    北邮校赛 I. Beautiful Array(DP)
    北邮校赛 H. Black-white Tree (猜的)
    北邮校赛 F. Gabriel's Pocket Money(树状数组)
    HDU 5862 Counting Intersections(离散化 + 树状数组)
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11615829.html
Copyright © 2011-2022 走看看