2015北京网络赛 J Scores bitset+分块
2015-09-25 11:47
549 查看
2015北京网络赛 J Scores
题意:50000组5维数据,50000个询问,问有多少组每一维都不大于询问的数据
思路:赛时没有思路,后来看解题报告也因为智商太低看了半天看不懂。bitset之前没用过,查了下发现其实就是一个二进制表示,这里的每一位就表示原序中的状态。
建一个bitset<50000> bs[6][sqrt(50000)], bs[i][j] 就表示在第i维上前j个块中的数据在原序中是哪些位置。
题意:50000组5维数据,50000个询问,问有多少组每一维都不大于询问的数据
思路:赛时没有思路,后来看解题报告也因为智商太低看了半天看不懂。bitset之前没用过,查了下发现其实就是一个二进制表示,这里的每一位就表示原序中的状态。
建一个bitset<50000> bs[6][sqrt(50000)], bs[i][j] 就表示在第i维上前j个块中的数据在原序中是哪些位置。
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <bitset> #define LL long long #define eps 1e-8 #define INF 0x3f3f3f3f #define MAXN 50005 using namespace std; struct Node{ int x, pos; }; bitset<MAXN> bs[6][230]; int t[6]; bitset<MAXN> res[6], w; bool compare(Node a, Node b){ return a.x < b.x; } Node s[6][MAXN]; int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); #endif // OPEN_FILE int T; int n, m; scanf("%d", &T); while (T--){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++){ for (int j = 1; j <= 5; j++){ scanf("%d", &s[j][i].x); s[j][i].pos = i; } } for (int i = 1; i <= 5; i++){ sort(s[i] + 1, s[i] + 1 + n, compare); } int u = sqrt(n); int num = n / u; if (n % u != 0){ num++; } memset(bs, 0, sizeof(bs)); for (int i = 1; i <= 5; i++){ for (int j = 1;j <= num; j++){ bs[i][j] |= bs[i][j - 1]; int left = (j - 1) * u + 1, right = j * u; if (right > n){ right = n; } for (int k = left; k <= right; k++){ bs[i][j][s[i][k].pos] = 1; } } } int ans = 0; int q; scanf("%d", &q); while (q--){ for (int i = 1; i <= 5; i++){ scanf("%d", &t[i]); t[i] ^= ans; } for (int i = 1; i <= 5; i++){ int left = 1, right = n; while (left < right){ int mid = (left + right) >> 1; if (s[i][mid].x > t[i]){ right = mid; } else{ left = mid + 1; } } int pos; if (s[i][left].x > t[i]){ pos = left - 1; } else{ pos = left; } int u_pos = (pos - 1) / u; res[i] = bs[i][u_pos]; for (int j = u_pos * u + 1; j <= pos; j++){ res[i][s[i][j].pos] = 1; } } w = res[1]; for (int i = 2; i <= 5; i++){ w &= res[i]; } ans = w.count(); printf("%d\n", ans); } } }
相关文章推荐
- Android 各大网络请求库的比较及实战
- 网络编程--TCP-IP--2
- TCP服务器listen函数的包裹函数
- 深度学习之卷积神经网络
- Android异步下载网络图片
- HTTP Status 404 - /project/deleteProjectReback/18
- hdu5445 || 2015长春网络赛1009题 多重背包问题
- PRML 阅读笔记之神经网络(一)
- iOS 网络请求 重要
- iOS 网络操作与AFNetworking
- 黑马程序员学习(十四) java网络编程
- curl http_code状态码 含义
- 让 http 2来得更猛烈些吧
- 有啊当年之败 恰恰是流量为王的哀伤
- tcpdump+wireshark分析数据笔记(1)
- Cookie设置HttpOnly,Secure,Expire属性
- Introduction to neural network —— 该“神经网络” 下拉“祭坛”
- 【iOS】网络操作与AFNetworking
- HTTPS 及加密信息全解析
- tcp pcap重放