首页 > 编程语言 >中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1)

中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1)

时间:2024-10-07 17:11:54浏览次数:11  
标签:PII return 秦皇岛 int SMU long 2024 tr1 define

中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1)

Problem A. 贵校是构造王国吗 I

思路

官方题解很清晰明了。

image

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define PII pair<int,int>
const int N=1e6+3;
void solve() {
    int n,k;
    cin>>n>>k;
    int dq=1;
    vector<PII>ans;
    set<PII>st;
    ans.push_back({1,1});
    st.insert({1,1});
    dq++;
    int ls=1;
    for (int i = 2; i <=n ; ++i) {
        ans.push_back({i,ls});
        st.insert({i,ls});
        dq++;
        ls++;
        ans.push_back({i,ls});
        st.insert({i,ls});
        dq++;
    }
    ans.push_back({1,n});
    st.insert({1,n});
    dq++;
    if(dq>k){
        for(auto [x,y]:ans){
            cout<<x<<' '<<y<<endl;

        }
        return ;
    }
    else{
        for (int i = 1; i <=n ; ++i) {
            for (int j = 1; j <=n ; ++j) {
                if(st.count({i,j})==0){
                    ans.push_back({i,j});
                    if(ans.size()==k){
                        for(auto [x,y]:ans){
                            cout<<x<<' '<<y<<endl;

                        }
                        return ;
                    }
                }
            }
        }
    }

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



    return 0;
}

Problem D. 茶和咖啡

思路

和题解类似。不过我们是用线段树维护前缀最小的物品。

image

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define INF INT_MAX
#define N 200010
#define lc p<<1
#define rc p<<1|1
int n, w[N];
int a[N],b[N];
struct node{
	int l,r;
	PII mi;
}tr[N<<2],tr1[N<<2];
void push_up(int p){
	tr[p].mi=min(tr[lc].mi,tr[rc].mi);
}
void build(int p,int l,int r){
	tr[p]={l,r,{0,0}};
	if(l==r){tr[p]={l,r,{w[l]-b[l],l}};return;}
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	push_up(p);
}
void update(int p,int x,int k){
	if(tr[p].l==x and tr[p].r==x){
		tr[p].mi.first+=k;
		return;
	}
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid)update(lc,x,k);
	if(x>mid)update(rc,x,k);
	push_up(p);
}
PII query(int p,int x,int y){
	if(x<=tr[p].l and tr[p].r<=y){
		return tr[p].mi;
	}
	int mid=tr[p].l+tr[p].r>>1;
	PII sum={INF,0};
	if(x<=mid){
		sum=min(sum, query(lc,x,y));
	}
	if(y>mid){
		sum=min( query(rc,x,y),sum);
	}
	return sum;
}

void push_up1(int p){
	tr1[p].mi=min(tr1[lc].mi,tr1[rc].mi);
}
void build1(int p,int l,int r){
	tr1[p]={l,r,{0,0}};
	if(l==r){tr1[p]={l,r,{w[l]-b[l],l}};return;}
	int mid=(l+r)>>1;
	build1(lc,l,mid);
	build1(rc,mid+1,r);
	push_up1(p);
}
void update1(int p,int x,int k){
	if(tr1[p].l==x and tr1[p].r==x){
		tr1[p].mi.first+=k;
		return;
	}
	int mid=tr1[p].l+tr1[p].r>>1;
	if(x<=mid)update1(lc,x,k);
	if(x>mid)update1(rc,x,k);
	push_up1(p);
}
PII query1(int p,int x,int y){
	if(y==0)return {INF,0};
	if(x<=tr1[p].l and tr1[p].r<=y){
		return tr1[p].mi;
	}
	int mid=tr1[p].l+tr1[p].r>>1;
	PII sum={INT_MAX,0};
	if(x<=mid){
		sum=min(sum, query1(lc,x,y));
	}
	if(y>mid){
		sum=min( query1(rc,x,y),sum);
	}
	return sum;
}

void solve(){
	int q;
	cin>>n>>q;
	for (int i = 1; i <=n ; ++i) {
		cin>>w[i];
		a[i]=b[i]=0;
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		int x,y;
		cin>>x>>y;
		a[x]+=y;
	}
	b[n+1]=0;
	for(int i=n;i>=1;i--){
		b[i]=a[i]+b[i+1];
	}
	build1(1,1,n);
	int pos=n,s=0;
	int ans=0;
	for(int i=1;i<=n;i++){
		auto[mn,pp]=query1(1,1,pos);
		mn+=s;
		if(pos<n){
			auto[mn1,pp1]=query(1,pos+1,n);
			if(mn1<mn){
				mn=mn1;
				pp=pp1;
			}
		}
		if(pp<=pos){
			pos=pp-1;
			s=b[pp];
		} 
		update(1,pp,INF);
		update1(1,pp,INF);
		ans+=mn;
		cout<<ans<<' ';
	}cout<<endl;
}

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

Problem G. 最大路径

思路

懒得写了,题解写得很清楚,赞

image

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define PII pair<int,int>
const int N=1e6+3;
void solve() {
    int n,m;
    cin>>n>>m;
    int ans=0;
    vector<int>a(n),b(m);
    for (int i = 0; i <n ; ++i) {
        cin>>a[i];
    }
    for (int i = 0; i <m ; ++i) {
        cin>>b[i];
    }
    for (int i = 1; i <n ; ++i) {
        ans+=abs(a[i-1]-a[i]);
    }
    for (int i = 1; i <m ; ++i) {
        ans+=abs(b[i-1]-b[i]);
    }
    cout<<ans<<endl;

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



    return 0;
}

Problem J. 维克多词典

思路

子集 DP。

单词长度很小,可以考虑状压DP求答案。

设 \(dp_S\) 为为学习完 S 的集合长度的单词的最小天数,转移的时候枚举每个 S 的子集即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define int long long
#define double long double
#define LL __int128
#define PII pair<double,double>
#define PIC pair<int,char>
#define endl '\n'
typedef long long ll;
const int N = 1e4 + 10;
int a[100];
vector<int>q;
PII S[N];
vector<int>g[20];
void solve() {
	int n, w;
	cin >> n >> w;
	int t = 0;
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		if (!a[x]) {
			t++;
			q.push_back(x);
		}
		a[x]++;
	}
	for(int i=0;i<(1<<t);i++){
		S[i]={1e9,1e9};
		g[__builtin_popcount(i)].push_back(i);
	}
	S[0]={0,0};
	for (int i = 0; i < t; ++i){
		for(auto j:g[i]){
			for(int k=0;k<t;k++){
				if ((j >> k & 1)==0) {
					PII x=S[j];
					if(a[q[k]]+x.second<=w){
						x.second+=a[q[k]];
					}else{
						x.first++;
						x.second=a[q[k]];
					}
					
					S[j^(1<<k)]=min(S[j^(1<<k)],x);
				}
			}
			
		}
	}
		cout<<S[(1<<t)-1].first+(S[(1<<t)-1].second>0)<<endl;
	
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
//	cin>>t;
	while (t--) {
		solve();
	}

	return 0;
}

标签:PII,return,秦皇岛,int,SMU,long,2024,tr1,define
From: https://www.cnblogs.com/Kescholar/p/18450322

相关文章

  • 多校 A 层冲刺 NOIP2024 模拟赛 03
    多校A层冲刺NOIP2024模拟赛03T1五彩斑斓(colorful)签到题直接暴力枚举是\(O(n^4)\),考虑使用\(bitset\)优化,对每个点开个\(bitset\),预处理它所在一行它及它之前相同颜色的位置,这样就只用枚举另一个点所在列,时间复杂度为\(O(n^3+\frac{n^4}{w})\)。T2错峰旅行(travel)......
  • HO引擎近况20241007
    又好几个月没更新,原因是感觉人生有点迷茫了6月这被公司裁员了8月才找到工作,还是原同事推荐的,只凭简历的话根本没可能新的公司又让我长见识了,完全不考虑程序的设计和日后的扩展及维护,只求快速出东西,俩月出一个DEMO,次留好就继续,不好就砍掉项目继续也不是重新正式开发,它没有一个......
  • Windows 11 version 24H2 & LTSC 2024 中文版、英文版 (x64、ARM64) 下载 (updated Oc
    Windows11version24H2&LTSC2024中文版、英文版(x64、ARM64)下载(updatedOct2024)Windows11,version24H2,企业版arm64x64请访问原文链接:https://sysin.org/blog/windows-11/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org全新Windows体验,让您与热......
  • 20222301 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    一、实验目的本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个......
  • The 2020 ICPC Asia Shenyang Regional Programming Contest Northeastern University
    The2020ICPCAsiaShenyangRegionalProgrammingContestNortheasternUniversity(SMU2024ICPC网络赛选拔赛2)D.JourneytoUn'Goro思路队友写得,没看。代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongintll;#defineintlonglong#defineP......
  • 2024.10.7 test
    nf#33B有一棵包含\(n\)个节点的有根树,且树的高度不超过\(100\)。每次操作时可以选择一个节点\(u\),使其与父节点断开(如果有),成为一颗新树的根节点,然后删除以节点\(u\)为根的树中的所有叶节点。求删除所有节点所需的最少操作次数和通过最少次操作删除所有节点的方案数。\(n......
  • SMU Autumn 2024 Personal Round 1
    SMUAutumn2024PersonalRound1前言拉了,后面有空再补补。A.LexString思路排序后取最小,记录连续取了几个,不要超过\(k\)个即可。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidsolve(){ intn,m,k; cin>>n>>m>>k;......
  • 2024.7.26 集训笔记
    单调栈给定一个长度为\(n\)的数列\(a\),对每个数字求出其右/左边第一个值大于等于它的数字的位置。考虑从左到右扫整个序列,维护一个栈,里面存放可能成为答案的数字,当遍历到一个新的数\(a_i\)的时候,可以发现栈中\(\leqa_i\)的数就再也不可能成为答案了,那就把它们弹掉,此时......
  • 20222427 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容(1)本周学习内容1.学习缓冲区溢出的基本原理。2.重温栈与堆的概念以及执行流程。3.逐步熟悉Linux系统对文件的处理流程,掌握基础的汇编与反汇编语言。(2)本周实验任务1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。2.利用foo函数的Bof漏洞,构造一个攻......
  • 2024 Noip 做题记录(四)
    \(\text{ByDaiRuiChen007}\)Round#13-2024.10.1A.[ARC165D]CompareProblemLink题目大意判断是否存在一个长度为\(n\)的字符串\(S\),满足\(m\)个限制\((a,b,c,d)\),要求\(S[a,b]\)字典序小于\(S[c,d]\)。数据范围:\(n,m\le2000\)。思路分析从一些必要条......