2022/8/21

​今天鼻炎犯了躺了好久,,,题也没大做,,

活动地址:CSDN21天学习挑战赛

C - Monoblock

昨天想的结论想的太复杂了,没有看出真正的规律来,应该左右分别讨论,如果x和a[i-1]相同那么只有与i,i-1在一块的区间才会受到影响,多算几个就会发现是(n-i+1)*(i-1),总答案就要加上这个数,如果是情况相反的话总答案就要减去这个数,而i+1的话就是加的数变成了(n-i)*i别的和左边一样,一开始的情况如果a[i]==a[i-1]那么受影响的只有i这一个数后缀也就只有i做第一个时才会增加一个,所以后缀+1,答案+=后缀,如果a[i]!=a[i-1]那么受影响的是i以及i前边的数,所以后缀要加i,答案+=后缀

Codeforces Round #816 (Div. 2) A - D - 知乎 (zhihu.com)

#include 
#define ll long long
#define lowbit(i) (i)&(-i)
using namespace std;
const ll mod=1e9+7;
const ll inf=1e18;
const double eps=1e-8;
ll qpow(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
ll n,m,a[100005];
int main(){
    scanf("%lld%lld",&n,&m);
    ll suf=0,ans=0;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        if(a[i]!=a[i-1]) suf+=i,ans+=suf;
        else suf++,ans+=suf;
    }
    while(m--){
        ll i,x;
        scanf("%lld%lld",&i,&x);
        if(a[i]==x){
            printf("%lld\n",ans);continue;
        }
        if(a[i-1]==x&&a[i]!=a[i-1]) ans-=(n-i+1)*(i-1);
        if(a[i-1]!=x&&a[i]==a[i-1]) ans+=(n-i+1)*(i-1);
        if(a[i+1]==x&&a[i]!=a[i+1]) ans-=(n-i)*i;
        if(a[i+1]!=x&&a[i]==a[i+1]) ans+=(n-i)*i;
        printf("%lld\n",ans);
        a[i]=x;
    }
    return 0;
}

I-Yet Another FFT Problem?_"蔚来杯"2022牛客暑期多校训练营10 (nowcoder.com) 鸽笼原理

把式子变换一下也就是a[i]+b[l]==a[j]+b[k],那也就是a[i]+b[j]只要出现了两次就说明是有重复的数了,当然前提是在去重的情况下,所以我们可以直接n*m的暴力,因为a[i],b[i]的范围都在1e7以内,所以a[i]+b[j]也就在2e7以内,所以只要跑上2e7+2次就一定会有一个数出现两次的情况,所以这也不算暴力,当然也会出现a中有两个数相等,b中也有两个数相等的情况,那就特判一下就可以了,然后代码上又被折磨了,一直不过,最后改的都快一模一样了说内存超限,然后换了个标准内存又可以了,真是服了,,然后自己写的代码不行,别人的就能过,应该是scanf的原因,,

#include 
#define ll long long
#define lowbit(i) (i)&(-i)
using namespace std;
const int mod=1e9+7;
const ll inf=1e18;
const double eps=1e-8;
int qpow(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
int n,m;
bool mp[20000007];
pairvis[20000007];
int a[1000006],b[1000006],id[10000007],posa[10000007],posb[10000007],ai=0,aj=0,bi=0,bj=0;
int main(){
    cin >> n >> m;
    for (int i = 1; i <= n; i++)cin >> a[i], posa[a[i]] = i;
    for (int i = 1; i <= m; i++)cin >> b[i], posb[b[i]] = i;
    for (int i = 1; i <= n; i++) {
        if (id[a[i]]) { ai = id[a[i]], aj = i; break;}
        id[a[i]] = i;
    }
    memset(id,0,sizeof(id));//清空
    for (int i = 1; i <= m; i++) {
        if (id[b[i]]) {bi = id[b[i]], bj = i; break;}
        id[b[i]] = i;
    }
    if (ai != 0 && aj != 0 && bi != 0 && bj != 0) {
        cout << ai << " " << aj << " " << bi << " " << bj << endl;
        return 0;
    }
//    scanf("%lld%lld",&n,&m);
//    for(int i=1;i<=n;i++){
//        scanf("%lld",&a[i]);
//        posa[a[i]]=i;
//    }
//    for(int i=1;i<=m;i++){
//        scanf("%lld",&b[i]);
//        posb[b[i]]=i;
//    }
//    for(int i=1;i<=n;i++){
//        if(id[a[i]]){ai=id[a[i]];aj=i;break;}
//        id[a[i]]=i;
//    }
//    memset(id,0,sizeof(id));
//    for(int i=1;i<=n;i++){
//        if(id[b[i]]){bi=id[b[i]];bj=i;break;}
//        id[b[i]]=i;
//    }
//    if(ai&&aj&&bi&&bj){
//        printf("%lld %lld %lld %lld\n",ai,aj,bi,bj);
//        return 0;
//    }
//    sort(a+1,a+n+1);
//    sort(b+1,b+m+1);
//    n=unique(a+1,a+n+1)-a-1;
//    m=unique(b+1,b+m+1)-b-1;
sort(a + 1, a + 1 + n); n = unique(a + 1, a + 1 + n) - (a + 1);
    sort(b + 1, b + 1 + m); m = unique(b + 1, b + 1 + m) - (b + 1);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            int num = a[i] + b[j];
            if (mp[num]) {
                int ai = vis[num].first, bj = vis[num].second;
                cout << ai << " " << posa[a[i]] << " " << bj << " " << posb[b[j]] << endl;
                return 0;
            }
            else {
                mp[num] = 1;
                vis[num] = { posa[a[i]],posb[b[j]] };
            }
        }
    }
    cout << "-1" << endl;
//    for(int i=1;i<=n;i++)
//    for(int j=1;j<=m;j++){
//        int num=a[i]+b[j];
//        if(mp[num]){
//            printf("%lld %lld %lld %lld\n",vis[a[i]+b[j]].first,posa[a[i]],vis[a[i]+b[j]].second,posb[b[j]]);
//            return 0;
//        }
//        mp[num]=1;
//        vis[num]={posa[a[i]],posb[b[j]]};
//    }
//    printf("-1\n");
    return 0;
}

你可能感兴趣的:(总结,算法,c++,c++,算法,开发语言)