Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #pragma optimization_level 3
- #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
- #include <iostream>
- #include <fstream>
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <functional>
- #include <bitset>
- #include <string>
- #include <stack>
- #include <time.h>
- #include <random>
- #include <unordered_set>
- #include <queue>
- using namespace std;
- #define ll long long
- //#define cin in
- //#define cout out
- #define pii pair<int, int>
- #define ld long double
- #define u_set unordered_set
- #define uid uniform_int_distribution
- ifstream in("input.txt");
- ofstream out("output.txt");
- int sz = 0, n, w;
- const int TREE_SZ = 524288;
- int tree[TREE_SZ];
- vector<int> queries;
- void update(int v, int val, int lb, int rb, int &ans) {
- if(tree[v] < val) {
- ans = -1;
- return;
- }
- if(lb == rb) {
- tree[v] -= val;
- ans = lb+1;
- return;
- }
- int mid = (lb + rb)/2;
- if(tree[2*v] >= val)
- update(2*v, val, lb, mid, ans);
- else
- update(2*v+1, val, mid+1, rb, ans);
- tree[v] = max(tree[2*v], tree[2*v+1]);
- }
- int update(int val) {
- int ans;
- update(1, val, 0, sz-1, ans);
- return ans;
- }
- vector<int> my_ans;
- /*
- checker
- */
- vector<int> right_ans;
- void rand_gen() {
- sz = rand() % 10 + 1;
- w = rand() % 10 + 1;
- n = rand() % 5 + 1;
- right_ans = vector<int> ();
- my_ans = vector<int> ();
- fill(tree, tree+TREE_SZ, 0);
- queries = vector<int> (n);
- for(int i = 0; i < n; i++)
- queries[i] = rand() % 10 + 1;
- }
- void solve() {
- vector<int> sheet(sz, w);
- for(int i = 0; i < n; i++) {
- int cur_w = queries[i];
- int ans = -1;
- for(int j = 0; j < sz; j++) {
- if(sheet[j] >= cur_w) {
- sheet[j] -= cur_w;
- ans = j+1;
- break;
- }
- }
- right_ans.push_back(ans);
- }
- }
- void print_cond () {
- cout << sz << ' ' << w << ' ' << n << '\n';
- for(int x: queries)
- cout << x << '\n';
- }
- void my_sol() {
- fill(tree, tree + 2*sz+1, w);
- for(int x: queries)
- my_ans.push_back(update(x));
- }
- int main()
- {
- int k = 10000;
- srand(time(0));
- while(k--) {
- rand_gen();
- solve();
- my_sol();
- //print_cond();
- if(k % 1000 == 0)
- cout << '-';
- if(my_ans != right_ans) {
- cout << "\nBAD\n";
- print_cond();
- exit(0);
- }
- }
- //input();
- //gen();
- }
- /*
- int main()
- {
- int w, n;
- cin >> sz >> w >> n;
- fill(tree, tree + 2*sz+1, w);
- while(n--) {
- int a;
- cin >> a;
- cout << update(a) << '\n';
- }
- }
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement