Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <cstdlib>
- using namespace std;
- struct queue{
- int name;
- queue *left, *right;
- };
- class cqueue{
- queue *head, *tail;
- long int length;
- long long int sum;
- public:
- cqueue(){ head = NULL; tail = NULL; length = 0; sum = 0;}
- long int getLength(){return length;}
- long long int getSum() {return sum;}
- queue *getHead(){return head;}
- queue *getTail(){return tail;}
- void add_tail(long int m);
- long int leave();
- long int getkx(int k);
- void release();
- };
- void cqueue::add_tail(long int name){
- if(name <= 0) return;
- queue *temp = new queue;
- temp->name = name;
- temp->right = NULL;
- if(tail){
- tail->right = temp;
- temp->left = tail;
- tail = temp;
- sum += name;
- }else{
- head = tail = temp;
- head->left = 0;
- sum = name;
- }
- length++;
- }
- long int cqueue::leave(){
- if(!head) return 0;
- int Res = head->name;
- if(length == 1) {
- delete head;
- head = NULL;
- tail = NULL;
- length = 0;
- sum = 0;
- return Res;
- }
- queue *temp = head;
- head = head->right;
- head->left = NULL;
- delete temp;
- length--;
- sum -= Res;
- return Res;
- }
- long int cqueue::getkx(int k){
- queue *temp = head;
- long int Res = 0;
- while(temp){
- temp->name -= k;
- if(temp->name <= 0){
- queue *t = temp;
- Res += k + temp->name;
- if(temp->left)temp->left->right = temp->right;
- else head = temp->right;
- if(temp->right)temp->right->left = temp->left;
- else tail = temp->left;
- temp = temp->right;
- sum -= t->name + k;
- delete t;
- length--;
- }else{
- Res += k;
- sum -= k;
- temp = temp->right;
- }
- }
- return Res;
- }
- int main(){
- ifstream fin("bureaucracy.in");
- ofstream fout("bureaucracy.out");
- cqueue buro;
- long int n = 0, m= 0;
- fin>>n>>m;
- long int i = 0, name;
- while(fin>>name && i++ < n){
- buro.add_tail(name);
- }
- if(m >= buro.getSum()){
- fout<<"-1"<<endl;
- }else{
- long int k = m/buro.getLength();
- while(k){
- m -= buro.getkx(k);
- k = m/buro.getLength();
- }
- for(long int i = 0; i < m; i++){
- long int n = buro.leave();
- buro.add_tail(n-1);
- }
- fout<<buro.getLength()<<endl;
- queue *temp = buro.getHead();
- while(temp) {
- fout<<temp->name<<" ";
- temp = temp->right;
- }
- fout<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment