codeforces 558D Guess Your Way Out! II 规律

题目链接

题意:

给出n和q

表示有一棵深度为n的完全二叉树,叶子节点中有恰好一个点是出口 主角从根往下走,但不知道出口在哪里,但主角会获得q个提示。

 像这样标号

q个提示 格式: deep [l, r] ok

表示 深度为deep 时, 出口(可能在) (一定不在)[l,r]区间

ok=1表示 是可能在 ok=0一定不在

目标:

若根据提示能找到出口则输出叶子节点下标,有多个可能的出口则输出data not sufficient,若给出的提示互相矛盾输出 Game cheatde

思路:

首先把所有提示的区间都映射到叶子节点上

先把一定不在的问题转成2个一定存在的提示。

那么显然每个提示里都包含了出口,所以我们查询一下哪个点是被q个区间覆盖了,则这个点就是出口。

#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <cstdio>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
using namespace std;
template <class T>
inline bool rd(T &ret) {
	char c; int sgn;
	if (c = getchar(), c == EOF) return 0;
	while (c != '-' && (c<'0' || c>'9')) c = getchar();
	sgn = (c == '-') ? -1 : 1;
	ret = (c == '-') ? 0 : (c - '0');
	while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
	ret *= sgn;
	return 1;
}
template <class T>
inline void pt(T x) {
	if (x <0) {
		putchar('-');
		x = -x;
	}
	if (x>9) pt(x / 10);
	putchar(x % 10 + '0');
}
typedef long long ll;
typedef pair<ll, ll> pii;
const int N = 500005;
const int inf = 1e9 + 10;
int n, q;

ll L[55], R[55];
map<ll, int>mp;
int main() {
	L[1] = R[1] = 1;
	for (int i = 2; i <= 50; i++)L[i] = L[i - 1] << 1, R[i] = R[i - 1] << 1 | 1;
	rd(n); rd(q);
	if (q == 0) {
		if (n == 1)puts("1");
		else puts("Data not sufficient!");
		return 0;
	}
	for (int i = 0, dep, ok; i < q; i++) {
		ll l, r;
		rd(dep); rd(l); rd(r); rd(ok);
		while (dep < n) {
			l <<= 1;
			r = r << 1 | 1;
			dep++;
		}
		if (ok)mp[l]++, mp[r + 1]--;
		else {
			mp[L[n]]++; mp[l]--;
			mp[r + 1]++; mp[R[n]+1]--;
		}
	}
	int sum = 0;
	ll pre = -1, cnt = 0, ans = 0;
	for (auto i : mp) {
		sum += i.second;
		if (pre != -1) {
			cnt += i.first - pre;
			ans = pre;
		}
		if (sum == q)pre = i.first;
		else pre = -1;
	}
	if (cnt == 0)puts("Game cheated!");
	else if (cnt > 1)puts("Data not sufficient!");
	else pt(ans);
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 22:16:16

codeforces 558D Guess Your Way Out! II 规律的相关文章

区间合并 --- Codeforces 558D : Gess Your Way Out ! II

D. Guess Your Way Out! II Problem's Link: http://codeforces.com/problemset/problem/558/D Mean: 一棵满二叉树,树中某个叶子节点是出口,目的是寻找这个出口.再给定Q个询问的结果,每个结果告诉我们在第i层中(l,r)覆盖的叶结点是否包含出口. analyse: 基本思路:多个区间求交集. 具体实现: 对于每一个询问,把它转化到最底层.并且把不在(l,r)区间的询问改为在(最左边,l-1)和(r+1,最右边)

Codeforces 837E Vasya&#39;s Function 数论 找规律

题意:定义F(a,0) = 0,F(a,b) = 1 + F(a,b - GCD(a,b).给定 x 和 y (<=1e12)求F(x,y). 题解:a=A*GCD(a,b) b=B*GCD(a,b),那么b-GCD(a,b) = (B-1)*GCD(a,b),如果此时A和B-1依然互质,那么GCD不变下一次还是要执行b-GCD(a,b).那么GCD什么时候才会变化呢?就是说找到一个最小的S,使得(B-S)%T=0其中T是a的任意一个因子.变形得到:B%T=S于是我们知道S=min(B%T).也

Codeforces Gym 100114 A. Hanoi tower 找规律

A. Hanoi tower Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description you the conditions of this task. There are 3 pivots: A, B, C. Initially, n disks of different diameter are placed on the pivot A: the smallest dis

Codeforces Round #242 (Div. 2)C(找规律,异或运算)

一看就是找规律的题.只要熟悉异或的性质,可以秒杀. 为了防止忘记异或的规则,可以把异或理解为半加运算:其运算法则相当于不带进位的二进制加法. 一些性质如下: 交换律: 结合律: 恒等律: 归零律: 典型应用:交换a和b的值:a=a^b^(b=a); #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<

Codeforces Round #204 (Div. 2)——A找规律——Jeff and Digits

Jeff's got n cards, each card contains either digit 0, or digit 5. Jeff can choose several cards and put them in a line so that he gets some number. What is the largest possible number divisible by 90 Jeff can make from the cards he's got? Jeff must

CodeForces - 848A From Y to Y (找规律)

http://codeforces.com/problemset/problem/848/A 题目大意:刚开始集合里面都是单字符可认为是字符串,然后让你去合并任意两个串合并要消耗∑c=(a~z) f ( s , c ) * f ( t , c ) 的能量,其中 f ( s , c )表示字符串s中单字符c的个数.现在已知把所有字符合成一行字符串要花费的能量,问这个字符串可能的是? 解题思路:当 t 是和 s 中字符都相同的单字符时s和t组合的结果就是s的长度,对于一种字符来说增加的能量就是 l*

【Codeforces 707C】Pythagorean Triples(找规律)

一边长为a的直角三角形,a^2=c^2-b^2.可以发现1.4.9.16.25依次差3.5.7.9...,所以任何一条长度为奇数的边a,a^2还是奇数,那么c=a^2/2,b=c+1.我们还可以发现,1.4.9.16.25.36各项差为8.12.16.20,偶数的平方是4的倍数,那么c=a^2/4-1,b=a^2/4+1. #include <iostream> using namespace std; int main() { long long n; cin>>n; n*=n;

Codeforces 707 C. Pythagorean Triples(找规律)——Codeforces Round #368 (Div. 2)

传送门 Katya studies in a fifth grade. Recently her class studied right triangles and the Pythagorean theorem. It appeared, that there are triples of positive integers such that you can construct a right triangle with segments of lengths corresponding t

暑假集训cf50练之15

CodeForces 402A 水题,模拟 #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include&