首页 > 其他分享 >codeforces round 974(div.3) D(学会灵活拆分数据)

codeforces round 974(div.3) D(学会灵活拆分数据)

时间:2024-09-24 12:51:27浏览次数:1  
标签:back 974 窗口 int codeforces cin 任务 push div.3

解题历程:
首先想到的是用数组记录,遍历每一个任务的区间,对区间内的数值加1,比如对于发生在4和8天之内的任务,a[4]++,a[5]++……a[8]++。然后用双指针,记录持续天数的开始下标和结束下标,以l和l+d为边界的窗口遍历每一天,若是最高位寻找任务最多的一天,和区间最大值最小的一天。
后来发现题目要求的是任务的种类最多和最小而不是某一天数量最多,所以之前的思考全部都是错的。
之后我仔细观察窗口在滑动的时候发现当遇到任务的开始的那天时,窗口内的任务数会增加,当人任务的结束的那天离开窗口时,窗口内的任务数会减少,在这个现象中,任务的开始只与窗口的右边有关,任务的结束只与窗口的左边有关,那么就可以将任务的开始与结束拆开分别存储然后分别排序,然后用两个变量分别存储最大值和最小值这样就能找到答案了

代码:

#include<bits/stdc++.h>

#define all(x) x.begin(),x.end()
#define endl "\n"
#define inf 1e9

using namespace std;


int main(void )
{   
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
    int test;
    cin>>test;
	while(test--){
    	int n,k;
    	int mins=inf,maxs=0;
    	cin>>n;
    	vector<int>a(n+1,0);
    	vector<int>r,l;
    	int d;
    	cin>>d>>k;
    	while(k--)
    	{
    		int t;
    		cin>>t;
    		l.push_back(t);
    		cin>>t;
    		r.push_back(t);
		}
		l.push_back(1);
		r.push_back(n); 
		sort(all(r));
		sort(all(l));
		int l1=1,r1=d; 
		int ans1=1,ans2=1;
		int t=0;
		int t1,t2;
		t1=0,t2=0;
		while(l[t1]<=r1){
			t++;
			t1++;
		}
		maxs=t;
		mins=t;
		for(int i=0;i+r1<=n;i++){
			while(t2<r.size()&&r[t2]<l1+i){
				t--;
				t2++;
			}
			while(t1<l.size()&&l[t1]<=r1+i){
				t++;
				t1++;
			}
			if(mins<t){
				mins=t;
				ans2=l1+i;
			}
			if(maxs>t){
				maxs=t;
				ans1=l1+i;
			}
			
		}
		cout<<ans2<<' '<<ans1<<endl; 
	}
        
    return 0;
}

反思:
看完题目的第一步不应该是直接套公式解题,要做的应该是分析数据,观察数据的变化和特点,观察数据之间的联系

标签:back,974,窗口,int,codeforces,cin,任务,push,div.3
From: https://www.cnblogs.com/cavendishboys/p/18428909

相关文章

  • Codeforces Round 973 (Div. 2)
    A.Zhan'sBlender有\(n\)个水果,每秒可以消耗\(\min\{x,y\}\)个,问需要多少时间。整数除法的上取整操作即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglongintread(){intx=0;boolf=......
  • Codeforces Round 972(Div.2)题解
    CodeforcesRound972(Div.2)题解A.SimplePalindrome贪心贪心,尽可能元素数量平均,并且相同字母放在一起。#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#defineendl'\n'#de......
  • Codeforces Round 973 (Div.2) A-E题解
    CodeforcesRound973(Div.2)A-E题解比赛传送门A.Zhan'sBlender数学显然答案为\(\lceil\frac{n}{min(x,y)}\rceil\)。#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.en......
  • codeforces 1041 C. Coffee Break
    题意第一行输入三个整数\(n,m,d(1\leqn\leq2*10^5,n\leqm\leq10^9,1\leqd\leqn)\),第二行输入\(n\)个整数,保证每个数均不大于\(m\)。在每一天你都可以任意选择一个未选过的数\(a_i\),随后可以继续选任意一个大于\(a_i+d\)的数\(a_j\);接下来可以再选任意......
  • Codeforces Round 974 (Div. 3)
    CodeforcesRound974(Div.3)A-RobinHelps按题目要求一步步计算就行#include<bits/stdc++.h>usingnamespacestd;intn,k;voidsolve(){ cin>>n>>k; intsum=0,num,ans=0; for(inti=1;i<=n;++i){ cin>>num; if(num&g......
  • Codeforces Round 974 (Div. 3)
    A.RobinHelps模拟即可。B.RobinHoodandtheMajorOak注意到\(i^i\equivi\pmod2\),因此\(\sumi^i\equiv\sumi\pmod2\)。等差数列求和即可。C.RobinHoodinTown二分答案即可。D.RobertHoodandMrsHood枚举区间\([l,l+d-1]\)。此时我们需要快速......
  • Codeforces Round 974 (Div. 3)
    A:按题意模拟。B:\(i^i\)与\(i\)奇偶性相同,求\((n-k,n]\)的奇数个数。C:二分答案。D:即求每个\((i-d,i]\)有多少线段覆盖。扫到\(i\)时加入所有\(i=l\)的,弹出所有\(r\lei-d\)的。E:枚举相遇点,答案就是\(\min\big(\max(d_1,d_2)\big)\),最短路时记录状态......
  • Codeforces Round 973 (Div. 2)
    CodeforcesRound973(Div.2)A-Zhan'sBlender由于总量固定因此只用计算两个处理时间最大值即是所求#include<bits/stdc++.h>usingnamespacestd;intn;doublex,y;voidsolve(){ cin>>n; cin>>x>>y; inttim1=ceil(n*1.0/x); inttim2......
  • Codeforces Round 974 (Div. 3)
    A.RobinHelps题意:Robin一开始的钱为0,每个人都有ai个金币,如果ai>=k则Robin会拿着它的金币, 如果ai==0且手上有金币,Robin会送出1金币,输出Robin送了几次思路:按照题意Code:#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;usingi6......
  • Codeforces Round 973 (Div. 2)
    SolCF2013A每次最多操作\(\min(x,y)\),故答案为\(\lceil\frac{n}{\min(x,y)}\rceil\)。#include<bits/stdc++.h>usingnamespacestd;usingu32=unsigned;usingi64=longlong;usingu64=unsignedlonglong;usingi128=__int128;#defineIOS#de......