首页 > 其他分享 >NEERC2014题解

NEERC2014题解

时间:2024-09-29 22:11:31浏览次数:1  
标签:nxt cnt res int 题解 state ans NEERC2014

A

结论题,行着取

int n, m;
 
signed main(void) {
#ifdef ONLINE_JUDGE
    freopen("alter.in","r",stdin);
    freopen("alter.out","w",stdout);
#endif
	read(n), read(m);
	writeln(n / 2 + m / 2);
	for (int i = 2; i <= n; i += 2)
		writeln(i, ' '), writeln(1, ' '), writeln(i, ' '), writeln(m);
	for (int i = 2; i <= m; i += 2)
		writeln(1, ' '), writeln(i, ' '), writeln(n, ' '), writeln(i);
	//fwrite(pf, 1, o1 - pf, stdout);
	return 0;
}

B

按照比值排序贪心取满。
liubw的代码:

const int N=1e5+10;
const db eps=1e-8;
int n,A,B;
struct node{
    int a,b,g,ip;
    bool operator < (const node o) const{
        return a*o.b>o.a*b;
    }
}p[N];
db ans[N];
 
void fst_IO(){
    freopen("burrito.in","r",stdin);
    freopen("burrito.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout<<fixed<<setprecision(12);
}
 
int main(){
    fst_IO();
    cin>>n>>A>>B;
    for(int i=1;i<=n;i++) cin>>p[i].g>>p[i].a>>p[i].b,p[i].ip=i;
    sort(p+1,p+1+n);
    
    db reca=0,recb=0;
    for(int i=1;i<=n;i++){
        db nd;
        if(p[i].b>0) nd=min(p[i].g,((db)B-recb)/p[i].b);
        else nd=p[i].g;
        reca+=nd*p[i].a,recb+=min((db)p[i].g*p[i].b,((db)B-recb));
        ans[p[i].ip]=nd;
    }
    if(reca<A) cout<<-1<<' '<<-1<<'\n';
    else{
        cout<<reca<<' '<<recb<<'\n';
        for(int i=1;i<=n;i++) cout<<ans[i]<<" \n"[n==i];
    }
    return 0;
}

E

有限状态自动机是唬人的本质上是只要找到图上的必胜环即可,dfs

int n, res[101], nxt[101][3];
int tot, ans[50001], p[50001][3];
inline void dfs(int &x, vector<int> state, int len) {
	x = ++tot;
	p[x][0] = p[x][1] = p[x][2] = 1;
	int cnt[3] = {0, 0, 0};
	for (int i : state) ++cnt[res[i]];
	if (cnt[0] * cnt[1] == 0 && cnt[0] * cnt[2] == 0 && cnt[1] * cnt[2] == 0) {
		ans[x] = (res[state[0]] + 1) % 3;
		int trans = res[state[0]];
		if (len < 2 * n) {
			for (int i = 0; i < state.size(); i++)
				state[i] = nxt[state[i]][ans[x]];
			dfs(p[x][trans], state, len + 1);
			return;
		}
		int u = state[0];
		int T = 0;
		do {
			if (res[u] == 0) u = nxt[u][1];
			else if (res[u] == 1) u = nxt[u][2];
			else u = nxt[u][0];
			++T;
		} while (u != state[0]);
		p[x][trans] = tot - T + 1;
		return;
	}
	vector<int> s[3];
	for (int i : state) s[res[i]].push_back(nxt[i][0]);
	for (int i = 0; i < 3; i++) {
		sort(s[i].begin(), s[i].end());
		int l = unique(s[i].begin(), s[i].end()) - s[i].begin();
		while (s[i].size() > l) s[i].pop_back();
	}
	ans[x] = 0;
	for (int i = 0; i < 3; i++)
		if (cnt[i]) dfs(p[x][i], s[i], 0);
}
 
signed main(void) {
	freopen("epic.in", "r", stdin);
	freopen("epic.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		char c;
		cin >> c;
		if (c == 'R') res[i] = 0;
		if (c == 'P') res[i] = 1;
		if (c == 'S') res[i] = 2;
		cin >> nxt[i][0] >> nxt[i][1] >> nxt[i][2];
	}
	vector<int> state;
	for (int i = 1; i <= n; i++) state.push_back(i);
	int rt;
	dfs(rt, state, 0);
	cout << tot << endl;
	for (int i = 1; i <= tot; i++) {
		if (ans[i] == 0) putchar('R');
		if (ans[i] == 1) putchar('P');
		if (ans[i] == 2) putchar('S');
		for (int j = 0; j < 3; j++) cout << ' ' << p[i][j];
		cout << endl;
	}
	//fwrite(pf, 1, o1 - pf, stdout);
	return 0;
}

I

本质是求多少个线段能互相包含,就是LIS问题的变种。用树状数组优化DP即可。

const int N = 2e5 + 5;
int n, p[N], f[N], g[N];
 
struct BIT {
	int c[N];
	inline void update(int x, int v) {
		for (; x <= n; x += lowbit(x)) chkmax(c[x], v);
	}
	
	inline int query(int x) {
		int ret = 0;
		for (; x; x -= lowbit(x)) chkmax(ret, c[x]);
		return ret;
	}
} F, G;
 
signed main(void) {
#ifdef ONLINE_JUDGE
	freopen("improvements.in","r",stdin);
	freopen("improvements.out","w",stdout);
#endif
	read(n); int ans = 0;
	for (int i = 1; i <= n; i++) read(p[i]);
	for (int i = 1; i <= n; i++) {
		f[i] = F.query(p[i]) + 1;
		g[i] = G.query(n - p[i] + 1) + 1;
		chkmax(ans, f[i] + g[i] - 1);
		F.update(p[i], f[i]);
		G.update(n - p[i] + 1, g[i]);
	}
	
	writeln(ans);
	//fwrite(pf, 1, o1 - pf, stdout);
	return 0;
}

J

先算出n,然后dfs就可以了。

const int N = 2505;
char s[N]; int n, m, h[N]; vector <int> ans;
 
inline void dfs(int d, int lst) {
	if (d > m && lst == -1 && ans.size() == n) {
		for (auto u : ans) writeln(u, ' ');
		exit(0);
	}
	if (lst == -1) {
		if (!h[s[d] - '0']) h[s[d] - '0'] = 1, ans.push_back(s[d] - '0'), dfs(d + 1, -1), h[s[d] - '0'] = 0, ans.pop_back();
		if (d < m) dfs(d + 1, s[d] - '0');
	} else {
		int val = 10 * lst + s[d] - '0';
		if (val <= n && !h[val]) h[val] = 1, ans.push_back(val), dfs(d + 1, -1), h[val] = 0, ans.pop_back();
	}
}
 
signed main(void) {
#ifdef ONLINE_JUDGE
	freopen("joke.in","r",stdin);
	freopen("joke.out","w",stdout);
#endif
	readstr(s + 1); m = strlen(s + 1);
	int s = 0;
	for (n = 1; n <= 50; n++) {
		if (n < 10) s++;
		else s += 2;
		if (s == m) break;
	}
	dfs(1, -1);
	//fwrite(pf, 1, o1 - pf, stdout);
	return 0;
}
 

标签:nxt,cnt,res,int,题解,state,ans,NEERC2014
From: https://www.cnblogs.com/EternalEpic/p/18440865

相关文章

  • [USACO23JAN] Tractor Paths P 题解
    T4[USACO23JAN]TractorPathsP唯二的两道蓝题之一,但难度至少紫黑之间。思路是这篇题解的。首先一个贪心:跳到与当前区间相连的最靠右的区间肯定是最优的,由此倍增易得第一问。重点在于第二问的求解,我们发现这个东西很麻烦,这时候就需要一些寄巧了。具体来说,前人之述备矣。坑点:D......
  • 题解:AtCoder Beginner Contest AT_abc373_d ABC373D Hidden Weights
    题目传送门题目翻译给你一个NNN个点,MMM条边的有向图,其中边有边......
  • [2023四校联考3]sakuya 题解(根号分治)
    题目链接。题目分析第一个操作类似哈希冲突那一道题,可以运用类似的思路开一个二维表,很容易想到两种做法:开一个二维表,表上的第\(i\)行,第\(j\)列表示序列下标在模\(i\)意义下等于\(j\)的加法标记。对于修改操作,直接暴力修改对应的那一行的值即可,查询时用线段树查询那个......
  • 联考题解
    联考题解龙(dragon)难点:(1)删边后如何寻找新的最短路。(2)A,B两方的决策互相影响十分复杂。(3)如何统计每个起点的ans。解题:(3)解决这类多起点一终点的问题,可以想到dp。(1)解决这类最短路转移的问题,可以考虑最短路树。(2)解决这类博弈问题,可以设计两个dp数组,分别维护影响前后的ans,在转移......
  • [雅礼集训 2017 Day1]市场 题解
    题目链接题目分析听说是很典的一道题,很明显难点在于除法下取整的操作。类似花神那一道题,但是由于有区间加,所以无法进行暴力修改。很明显暴力复杂度爆炸,考虑下取整带来的性质:对于一对相邻的数,很明显有\(\lfloor\frac{x-1}{k}\rfloor\le\lfloor\frac{x}{k}\rfloor-1\)。......
  • i++和++i的区别,面试题解析
    i++和++i都是自增操作符,用于将变量的值增加1。i++是后增操作符,它首先返回变量的值,然后再将变量的值增加1。例如,如果i的初始值为1,执行i++后,i的值变为2。++i是前增操作符,它首先将变量的值增加1,然后再返回变量的值。例如,如果i的初始值为1,执行++i后,i的值变为2。区别在于返回值的......
  • CSP-J历年真题(部分)解析与题解
    目录序言:[CSP-J2020]直播获奖前言:题目描述输入格式输出格式输入输出样例说明/提示样例1解释数据规模与约定提示65分思路及代码前言:思路:代码:85分代码及思路:前言:插入排序:思路:代码: AC思路及代码:前言:思路:   代码: [CSP-J2022]乘方前言:题目描......
  • C语言 | Leetcode C语言题解之第445题两数相加II
    题目:题解:structListNode*addTwoNumbers(structListNode*l1,structListNode*l2){intstack1[100];intstack2[100];inttop1=0;inttop2=0;intcarry=0;intsum=0;structListNode*temp=NULL;structListNode*he......
  • C语言 | Leetcode C语言题解之第443题压缩字符串
    题目:题解:voidswap(char*a,char*b){chart=*a;*a=*b,*b=t;}voidreverse(char*a,char*b){while(a<b){swap(a++,--b);}}intcompress(char*chars,intcharsSize){intwrite=0,left=0;for(intr......
  • C++ | Leetcode C++题解之第445题两数相加II
    题目:题解:classSolution{public:ListNode*addTwoNumbers(ListNode*l1,ListNode*l2){stack<int>s1,s2;while(l1){s1.push(l1->val);l1=l1->next;}while(l2){......