Codeforces Round 816 (Div. 2)(D拆位图论构造 E斜率优化)

C:直接单独算每个位置的贡献,如果当前位置和前面位置重复了,那么前面就没选的位置了

修改的时候只要重新算i和i+1位置即可

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10,M=2*N,mod=1e9+7;
#define int long long
#define uLL unsigned long long
const long long inf=1e18;
typedef pair<int,int> PII;
typedef long long LL;
using node=tuple<int,int,int>;
int n,m,k;
int a[N];

int calc(int i){
    int res=0;
    int k=n-i+1;
    if(a[i]==a[i-1]) return k;
    return (n-i+1)*(i);
}
void solve()
{
    cin>>n>>m;
    int s=0;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
            s+=calc(i);

    }
    a[n+1]=0;
    
    while(m--){
        int x,y;cin>>x>>y;
        s-=calc(x);
        s-=calc(x+1);
        a[x]=y;
        s+=calc(x);
        s+=calc(x+1);
        cout<<s<<"\n";
        //cout<<calc((int)(st.size()))<<"\n";
    }
} 

signed main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
	int t=1;
//	cin>>t;
	
	while(t--) solve();
	return 0;
}

D:

拆位,考虑字典序最小,让开头的数能等于0就等于0

要先把一定是0的数和u==v这种确定的数先填了,后面根据字典序填即可

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10,M=2*N,mod=1e9+7;
#define int long long
#define uLL unsigned long long
const long long inf=1e18;
typedef pair<int,int> PII;
typedef long long LL;
using node=tuple<int,int,int>;
int n,m,k;
int a[N];
vector<PII> g[N];
int now[N];

void solve()
{
    cin>>n>>m;
    vector<array<int,3>> a(m);
    for(auto&i:a){
        cin>>i[0]>>i[1]>>i[2];
        g[i[0]].emplace_back(i[1],i[2]);
        g[i[1]].emplace_back(i[0],i[2]);
    }
    vector<int> res(n+10);
    for(int i=30;i>=0;i--)
    {
        memset(now,-1,sizeof(now));
        for(int j=1;j<=n;j++){
            for(auto [v,z]:g[j]){
               
                if(v==j){
                    now[j]=(z>>i&1);continue;
                } 
                if(z>>i&1) continue;
                now[j]=now[v]=0;
            }
        }
        for(int j=1;j<=n;j++)
        {
            if(g[j].size()==0)
            {
                now[j]=0;
            }
            if(now[j]!=-1) continue;
            for(auto [v,z]:g[j])
            {
                if(now[v]==0)//另一个固定了,j只能是1
                {
                    now[j]=1;
                    break;
                }
            }
            if(now[j]==-1)
            {
                for(auto [v,z]:g[j])
                {
                    now[v]=1;
                }
                now[j]=0;
            }
        }    
        for(int j=1;j<=n;j++)
        res[j]+=(now[j])*(1<<i);
    }
    for(int i=1;i<=n;i++) cout<<res[i]<<" ";
} 

signed main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
	int t=1;
	//cin>>t;
	
	while(t--) solve();
	return 0;
}

E:

直接斜率优化

考虑每层k进行斜率优化,毕竟转移只会从i-1转移到i层

fi=min(fj+(i-j)^2)

根据斜率优化式子

fi=fj+i*i-2*i*j+j*j

fj+j*j=2*i*j+fi-i*i

y=fj+j*j

k=2*i

b=fi-i*i

y=kx-b

当i确定的时候让b最小,fi一定最小

直接维护凸包即可

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10,M=2*N,mod=1e9+7;
#define int long long
#define uLL unsigned long long
const long long inf=1e18;
typedef pair<int,int> PII;
typedef long long LL;
using node=tuple<int,int,int>;
int n,m,k;
int a[N];
vector<PII> g[N];
int now[N];

void solve()
{
    cin>>n>>m;
    vector<array<int,3>> a(m);
    for(auto&i:a){
        cin>>i[0]>>i[1]>>i[2];
        g[i[0]].emplace_back(i[1],i[2]);
        g[i[1]].emplace_back(i[0],i[2]);
    }
    vector<int> res(n+10);
    for(int i=30;i>=0;i--)
    {
        memset(now,-1,sizeof(now));
        for(int j=1;j<=n;j++){
            for(auto [v,z]:g[j]){
               
                if(v==j){
                    now[j]=(z>>i&1);continue;
                } 
                if(z>>i&1) continue;
                now[j]=now[v]=0;
            }
        }
        for(int j=1;j<=n;j++)
        {
            if(g[j].size()==0)
            {
                now[j]=0;
            }
            if(now[j]!=-1) continue;
            for(auto [v,z]:g[j])
            {
                if(now[v]==0)//另一个固定了,j只能是1
                {
                    now[j]=1;
                    break;
                }
            }
            if(now[j]==-1)
            {
                for(auto [v,z]:g[j])
                {
                    now[v]=1;
                }
                now[j]=0;
            }
        }    
        for(int j=1;j<=n;j++)
        res[j]+=(now[j])*(1<<i);
    }
    for(int i=1;i<=n;i++) cout<<res[i]<<" ";
} 

signed main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
	int t=1;
	//cin>>t;
	
	while(t--) solve();
	return 0;
}
相关推荐
2601_967760785 小时前
2026年PDF压缩与页码添加工具技术实测:性能、算法与本地化适配深度对比
算法·pdf
不会就选b6 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
moonrailgun6 小时前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
罗西的思考7 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(1)--- 总体
人工智能·算法·机器学习
lvwangshu8 小时前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论
爱吃苹果的日记本8 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#
张小姐的猫8 小时前
【AI大模型接入SDK】 —— Gemini接入封装
android·数据结构·数据库·c++·人工智能·python
302wanger8 小时前
干与湿:AI 拿走脑力之后,人剩下什么
算法
计算机编程-吉哥9 小时前
脑肿瘤MRI智能识别系统:基于深度学习的像素级脑肿瘤语义分割平台【计算机毕业设计选题推荐】
人工智能·python·深度学习·算法·毕业设计·课程设计·大数据毕业设计选题推荐
用户2049375549510 小时前
端侧语音部署踩坑:模型能跑不等于终端真的能用
后端·算法