Advertisement
Guest User

Untitled

a guest
Nov 28th, 2015
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef unsigned long long ull;
  7. typedef long double ld;
  8.  
  9. #define forn(i,a,b) for( int i = (a); i < (b); i++ )
  10. #define rep(i,n) forn(i,0,n)
  11. #define repe(i,n) for( i = 0; i < (n); i++ )
  12. #define fi first
  13. #define se second
  14. #define mp make_pair
  15. #define pb push_back
  16. #define pii pair<int,int>
  17. #define pll pair<ll,ll>
  18. #define pdd pair<double,double>
  19.  
  20. const int MXP = 19;
  21. const int MXN = 100100;
  22.  
  23. vector< pair<ll,int> > val [MXP];
  24.  
  25. int ans [MXN];
  26. int anc;
  27.  
  28. ull pow( ull a, int n ){
  29.     ull res = 1;
  30.     rep(i,n) res*=a;
  31.     return res;
  32. }
  33.  
  34. int main()
  35. {
  36.  
  37.     //freopen("input.txt", "r", stdin);    freopen("output.txt", "w", stdout);
  38.     freopen("exact.in", "r", stdin);    freopen("exact.out", "w", stdout);
  39.  
  40.     ll x;
  41.     int n;
  42.     scanf("%lld%d", &x, &n);
  43.     rep(i,n){
  44.         int k,q;
  45.         scanf("%d%d", &k, &q);
  46.         ll cur = pow(10,k) * q;
  47.         val[k].pb( {cur,i} );
  48.     }
  49.     rep(i,MXP) sort(val[i].begin(), val[i].end());
  50.  
  51.     ll rest = 0;
  52.     ull cpow = 1;
  53.     vector< pair<ll,int> > tmp;
  54.     vector< pair<ll,int> > poss;
  55.     int curp = -1;
  56.     while(x){
  57.         curp++;
  58.         cpow*=10;
  59.         tmp.clear();
  60.         tmp.resize( poss.size() + val[curp].size() );
  61.         merge(poss.begin(), poss.end(), val[curp].begin(), val[curp].end(), tmp.begin());
  62.         tmp.swap(poss);
  63.         ll cur = x%cpow;
  64.         x -= cur;
  65.         if(rest>=cur){
  66.             rest -= cur;
  67.             continue;
  68.         }
  69.         cur -= (rest/(cpow/10)) * (cpow/10);
  70.         while(!poss.empty()){
  71.             pair<ll,int> q = poss.back();
  72.             ans[anc++] = q.se;
  73.             poss.pop_back();
  74.             if(cur <= q.fi){
  75.                 rest += q.fi - cur;
  76.                 cur = 0;
  77.                 break;
  78.             }
  79.             else{
  80.                 cur -= q.fi;
  81.             }
  82.         }
  83.         if(cur<=rest){
  84.             rest -= cur;
  85.         }
  86.         else{
  87.             printf("-1");
  88.             return 0;
  89.         }
  90.     }
  91.     printf("%d\n", anc);
  92.     rep(i,anc) printf("%d ", ans[i]+1);
  93.  
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement