首页 > 其他分享 >「题解」Codeforces 1765L Project Manager

「题解」Codeforces 1765L Project Manager

时间:2022-11-28 23:11:32浏览次数:43  
标签:typedef ch int 题解 ban Manager nxtw 1765L include

写了两个小时写吐了,你告诉我这玩意 2400?

如果不管假期的话,那么每一周必然会有一个项目跟进一次进度。那么答案就是线性的。即使有假期的存在也没关系,每个假期顶多就只会拖延一周的时间。

所以只需要暴力模拟每一天有哪些人工作了,完成了哪些项目的一个进度就可以了。

我的方法是对每个星期几维护一个 set,表示在这一天可能会工作的人,然后对每个人再开一个堆,存储这个人任务计划中的项目。

一个人可能在好几个星期几中工作,但是对于一个项目他只会工作一次,所以要搞个类似懒惰删除的东西,在一个人的任务计划里面找项目的时候需要判一下这个项目目前需不需要这个人来做。

然后就代码写得比较长......好像有更简单的写法。

#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<map>
#include<string>
#include<random>
#include<assert.h>
#include<set>
#define pb emplace_back
#define mp make_pair
#define fi first
#define se second
#define dbg(x) cerr<<"In Line "<< __LINE__<<" the "<<#x<<" = "<<x<<'\n'
#define dpi(x,y) cerr<<"In Line "<<__LINE__<<" the "<<#x<<" = "<<x<<" ; "<<"the "<<#y<<" = "<<y<<'\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int>pii;
typedef pair<ll,int>pli;
typedef pair<ll,ll>pll;
typedef pair<int,ll>pil;
typedef vector<int>vi;
typedef vector<ll>vll;
typedef vector<pii>vpii;
typedef vector<pil>vpil;
template<typename T>T cmax(T &x, T y){return x=x>y?x:y;}
template<typename T>T cmin(T &x, T y){return x=x<y?x:y;}
template<typename T>
T &read(T &r){
	r=0;bool w=0;char ch=getchar();
	while(ch<'0'||ch>'9')w=ch=='-'?1:0,ch=getchar();
	while(ch>='0'&&ch<='9')r=r*10+(ch^48),ch=getchar();
	return r=w?-r:r;
}
template<typename T1,typename... T2>
void read(T1 &x,T2& ...y){read(x);read(y...);}
const int inf=0x7fffffff;
const int N=200010;
int weektoday(int x,int y){
	return x*7+y;
}
map<string,int>xingqi;//星期几 -> number 
int n,m,k;
int rel[N];
set<int>ren[N];//人 星期几工作 
set<int>ban[8];//星期几   ban掉第几周 
int prl[N];
vi pro[N];//project
int jd[N];//进度
int ans[N];
//----------------------------------------------
int week=-1,lastxq=7;
int nxtw[8];//next week
int Nxt(int o){
	cmax(nxtw[o],week);
	if(ban[o].empty())return nxtw[o];
	while(nxtw[o]>(*ban[o].begin()))ban[o].erase(ban[o].begin());
	while(nxtw[o]==(*ban[o].begin()))ban[o].erase(ban[o].begin()),++nxtw[o];
	return nxtw[o];
}
//----------------------------------------------
set<int>sren[8];//星期几  有工作在身的人 
priority_queue<int,vector<int>,greater<int>>que[N];//每个人要完成的project
vpii GX;//第p个人要做第x个任务 
int nowday;
void Jin(int x){
//	dpi(week,lastxq);
	++jd[x];
	if(jd[x]<prl[x]){
		int p=pro[x][jd[x]];
		GX.pb(mp(p,x));
	}
	if(jd[x]==prl[x]){
		ans[x]=nowday;
	}
}
bool chk(int p,int x){//检查x目前是否是需要p来完成 
	if(jd[x]==prl[x])return 0;
	return pro[x][jd[x]]==p;
}
int Gongzuo(int p){//让p工作 并且 返回是否还有任务 
	while(!que[p].empty()){
		int x=que[p].top();
		if(!chk(p,x))que[p].pop();
		else break;
	}
	if(!que[p].empty()){
		int x=que[p].top();que[p].pop();
		Jin(x);
	}
	return !que[p].empty();
}
void Gengxin(){
	for(auto i:GX){
		int p=i.fi,x=i.se;
		if(que[p].empty()){
			for(auto j:ren[p]){
				sren[j].insert(p);
			}
		}
		que[p].push(x);
	}
	vpii().swap(GX);
}
signed main(){
    #ifdef do_while_true
//    	assert(freopen("data.in","r",stdin));
	#endif
	//"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday".
	xingqi["Monday"]=1;
	xingqi["Tuesday"]=2;
	xingqi["Wednesday"]=3;
	xingqi["Thursday"]=4;
	xingqi["Friday"]=5;
	xingqi["Saturday"]=6;
	xingqi["Sunday"]=7;
	read(n,m,k);
	for(int i=1;i<=n;i++){
		read(rel[i]);
		for(int j=1;j<=rel[i];j++){
			string str;
			cin >> str;
			ren[i].insert(xingqi[str]);
		}
	}
	for(int i=1;i<=m;i++){
		int x;read(x);
		ban[(x-1)%7+1].insert((x-1)/7);
	}
	for(int i=1;i<=k;i++){
		read(prl[i]);
		for(int j=1;j<=prl[i];j++){
			int x;read(x);
			pro[i].pb(x);
		}
	}
	for(int i=1;i<=k;i++){
		jd[i]=-1;
		Jin(i);
		Gengxin();
	}
//	int qwq=0;
	do{
//		++qwq;
//		dbg(qwq);
		static int mnd[8];
		static int pos[8];
		vi vec;
		for(int i=lastxq+1;i<=7;i++)mnd[i]=weektoday(Nxt(i),i);
		++week;
		for(int i=1;i<=lastxq;i++)mnd[i]=weektoday(Nxt(i),i);
		--week;
		for(int i=1;i<=7;i++)pos[i]=i;
		sort(pos+1,pos+7+1,[&](const int &x,const int &y){return mnd[x]<mnd[y];});
		bool fl=0;
		for(int i=1;i<=7;i++){
			int o=pos[i];
			if(sren[o].empty())continue;
			lastxq=o;
			nowday=mnd[pos[i]];
			week=(nowday-1)/7;
			vi peo;
			for(auto p:sren[o])peo.pb(p);
			for(auto p:peo){
				if(!Gongzuo(p)){
					sren[o].erase(p);
				}
			}
			Gengxin();
			fl=1;
			break;
		}
		if(!fl)break;
	}while(true);
	for(int i=1;i<=k;i++)cout << ans[i] << ' ';
    #ifdef do_while_true
//		cerr<<'\n'<<"Time:"<<1.0*clock()/CLOCKS_PER_SEC*1000<<" ms"<<'\n';
	#endif
	return 0;
}

标签:typedef,ch,int,题解,ban,Manager,nxtw,1765L,include
From: https://www.cnblogs.com/do-while-true/p/16934097.html

相关文章

  • AcApDataManager 类的用法
    AcApDataManager是一个模板类,它帮助开发人员按每个文档(而不是全局)存储数据。AcApDataManager对象是每个文档数据对象的容器。应用程序定义一个类来包含它的文档数据,然后......
  • angular FormArray 中嵌套 FormGroup 问题解决
    官方例子里说了FormArray可以嵌套group或者array,但只给了control的实例,这里记录一下嵌套groupts文件:import { Component } from '@angular/core';import { For......
  • 使用第三方IQKeyboardManager处理键盘问题
    这个库的下载地址:https://github.com/hackiftekhar/IQKeyboardManagerIQKeyboardManager的初始化当IQKeyboardManager初始化的时候,它做了这么几件事情:1.监听有关键盘的......
  • NOIP 2022 题解
    rp++juruo的noip真实成绩:0+0+0+0=0pts.题目大意洛谷有,这里就不放了。T1.种花可以维护每一个点向下最多延伸多长$xia_i$,向右延伸最多多长$you_i$,这样C就好求了,可以维......
  • 题解 P4448
    如果这不是一道原题,这道题出的还不错,是个比较毒瘤的数数。由于我太菜了反正我自己没有做出来后面的dp,zyf巨佬教的。不过听说合肥六中某巨佬当年也没做出来,平衡了雾但问......
  • AT_otemae2019_a 寝坊だ!ピ太郎! (You overslept, Pitaro) 题解
    题目大意:给出两个数 a,b 如果 a+0.5>b,输出 1,否则输出 0。a,b 均为整数。思路:这是一道模拟题,模拟即可。代码:注意:要开浮点型!#include<bits/stdc++.h>using......
  • CF1119E Pavel and Triangles 题解
    题面PavelandTriangles题面翻译给定n种木棍,第i+1种有ai​个,长度为2^i,求用这些木棍可以同时拼出多少个三角形(不可重复使用同一根)输入第一行n,第二行n个整数a0,a1,a2.........
  • P8867 [noip2022]建造军营 题解
    题意:给定一张图,选择一些点和一些边,使得割断任意没有选的边,被选中的点仍连通。对\(10^9+7\)取膜。\(n\leq5\cdot10^5\)这篇题解会略讲缩边,详讲自己推dp状态与......
  • Oracle的会话进程解锁及问题解决方法
    首先用dba权限的用户登陆数据库1、select*fromv$locked_object查出被锁定的对象,其中object_id是对象的ID,session_id是被锁定对象有sessionID;2、selectobject_name......
  • 『题解』Codeforces 1758B XOR = Average
    Description构造一个\(a\)序列,使\(a_1\oplusa_2\oplusa_3\oplus\cdots\oplusa_n=\dfrac{sum(a)}{n}\)。Solution第一眼看到这道题,我想到的是分情况讨论。......