Facebook
From Tinct Tamarin, 6 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 216
  1. #include <bits/stdc++.h>
  2. #define REP(i, n) for(int i = 0; i < n; i++)
  3. #define BCK(i, n) for(int i = n-1; i >= 0; i--)
  4. #define FWD(i, a, b) for(int i = a; i < b; i++)
  5. #define ALL(c) (c).begin(), (c).end()
  6. #define SIZE(c) ((int)(c).size())
  7. #define pb push_back
  8. #define st first
  9. #define nd second
  10. #define vi vector<int>
  11. #define pi pair<int, int>
  12. #define pll pair<long long, long long>
  13. #define vpi vector<pi>
  14. #define vpll vector<pll>
  15. #define mp(a, b) make_pair(a,b)
  16. using namespace std;
  17. typedef long long LL;
  18. typedef double ld;
  19.  
  20. int r,c;
  21.  
  22. struct Ride
  23. {
  24.         int a,b,x,y,s,f;
  25.         int idx;
  26. };
  27.  
  28. istream& operator>>(istream& is, Ride& r)
  29. {
  30.         return is>>r.a>>r.b>>r.x>>r.y>>r.s>>r.f;
  31. }
  32.  
  33. struct Car
  34. {
  35.         int x = 0; int y = 0;
  36.         int stoptime = 0;
  37.         vector<int> rides;
  38.         int arriveTime(const Ride& r) const{
  39.                 return max(stoptime + abs(x - r.a) + abs(y - r.b), r.s);
  40.         }
  41.         int finishTime(const Ride& r) const{
  42.                 int arr = arriveTime(r);
  43.                 return arr + abs(r.a-r.x) + abs(r.b-r.y);
  44.         }
  45.         void serveRide(const Ride& r){
  46.                 x = r.x;
  47.                 y = r.y;
  48.                 stoptime = finishTime(r);
  49.                 rides.pb(r.idx);
  50.         }
  51. };
  52.  
  53. int dist(int a, int b, int x, int y){
  54.         return abs(a-x) + abs(b-y);
  55. }
  56.  
  57. int score(const vector<Car>& cars, const vector<Ride>& rides, int b){
  58.         int ret=0;
  59.         for(auto const& car : cars){
  60.                 int x=0, y=0, t=0;
  61.                 for(auto i : car.rides){
  62.                         const Ride& r = rides[i];
  63.                         t += dist(x,y,r.a,r.b);
  64.                         t = max(t, r.s);
  65.                         if(t == r.s) ret += b;
  66.                         ret += dist(r.a, r.b, r.x, r.y);
  67.                         t += dist(r.a, r.b, r.x, r.y);
  68.                         x = r.x;
  69.                         y = r.y;
  70.                 }
  71.         }
  72.         return ret;
  73. }
  74.  
  75. vector<Car> firstSolution(vector<Car> cars, vector<Ride> rides){
  76.         sort(ALL(rides), [](const Ride& a, const Ride& b)
  77.           {return a.s < b.s;});
  78.         if(cars.empty()) return cars;
  79.         for(const auto& ride : rides){
  80.                 auto& best = *min_element(ALL(cars), [&ride](const Car& a, const Car& b)
  81.                   {return a.arriveTime(ride) < b.arriveTime(ride);});
  82.                 if(best.finishTime(ride) >= ride.f) {
  83.                         //cerr << "Ride " << ride.idx << " not served\n";
  84.                         continue;
  85.                 }
  86.                
  87.                 //if(best.arriveTime(ride) == ride.s)
  88.                 //      cerr << "Got bonus from ride " << ride.idx << '\n';
  89.                 best.serveRide(ride);
  90.         }
  91.         return cars;
  92. }
  93.  
  94. vector<Car> secondSolution(vector<Car> cars, vector<Ride> rides, float perc){
  95.         int size = cars.size() * perc;
  96.         if(cars.empty()) return cars;
  97.         //cerr << "size: " << size << " of " << cars.size() << '\n';
  98.         REP(i, size){
  99.                 Car& car = cars[i];
  100.                 while(1){
  101.                         Ride* best = nullptr;
  102.                         for(auto& ride : rides){
  103.                                 if(ride.s >= dist(ride.a, ride.b, car.x, car.y)  + car.stoptime){
  104.                                         if(!best || best->s >= ride.s){
  105.                                                 best = &ride;
  106.                                         }
  107.                                 }
  108.                         }
  109.                         if(!best)
  110.                                 break;
  111.                         car.serveRide(*best);
  112.                         *best = rides.back();
  113.                         rides.pop_back();
  114.                 }
  115.         }
  116.        
  117.         FWD(i, size, SIZE(cars)){
  118.                 Car& car = cars[i];
  119.                 while(1){
  120.                         Ride* best = nullptr;
  121.                         for(auto& ride : rides){
  122.                                 if(ride.f > dist(ride.a, ride.b, car.x, car.y) + car.stoptime + dist(ride.a, ride.b, ride.x, ride.y)){
  123.                                         if(!best || dist(best->a, best->b, car.x, car.y) >= dist(ride.a, ride.b, car.x, car.y)){
  124.                                                 best = &ride;
  125.                                         }
  126.                                 }
  127.                         }
  128.                         if(!best)
  129.                                 break;
  130.                         car.serveRide(*best);
  131.                         *best = rides.back();
  132.                         rides.pop_back();
  133.                 }
  134.         }
  135.        
  136.         return cars;
  137. }
  138.  
  139. vector<Car> thirdSolution(vector<Car> cars, vector<Ride> rides, float perc){
  140.         int size = cars.size() * perc;
  141.         if(cars.empty()) return cars;
  142.         //cerr << "size: " << size << " of " << cars.size() << '\n';
  143.         random_device rd;
  144.         mt19937 g(rd());
  145.         while(1){
  146.                 bool chosen = 0;
  147.                 shuffle(cars.begin(), cars.begin() + size, g);
  148.                 REP(i, size){
  149.                         Car& car = cars[i];
  150.                         Ride* best = nullptr;
  151.                         for(auto& ride : rides){
  152.                                 if(ride.s >= dist(ride.a, ride.b, car.x, car.y)  + car.stoptime){
  153.                                         if(!best || best->s >= ride.s){
  154.                                                 best = &ride;
  155.                                         }
  156.                                 }
  157.                         }
  158.                         if(best){
  159.                                 chosen = 1;
  160.                                 car.serveRide(*best);
  161.                                 *best = rides.back();
  162.                                 rides.pop_back();
  163.                         }
  164.                 }
  165.                 if(!chosen) break;
  166.         }
  167.         while(1){
  168.                 bool chosen = 0;
  169.                 shuffle(cars.begin()+size, cars.end(), g);
  170.                 FWD(i, size, SIZE(cars)){
  171.                         Car& car = cars[i];
  172.                         Ride* best = nullptr;
  173.                         for(auto& ride : rides){
  174.                                 if(ride.f > dist(ride.a, ride.b, car.x, car.y) + car.stoptime + dist(ride.a, ride.b, ride.x, ride.y)){
  175.                                         if(!best || dist(best->a, best->b, car.x, car.y) >= dist(ride.a, ride.b, car.x, car.y)){
  176.                                                 best = &ride;
  177.                                         }
  178.                                 }
  179.                         }
  180.                         if(best){
  181.                                 chosen = 1;
  182.                                 car.serveRide(*best);
  183.                                 *best = rides.back();
  184.                                 rides.pop_back();
  185.                         }
  186.                 }
  187.                 if(!chosen) break;
  188.         }
  189.         return cars;
  190. }
  191.  
  192. template <int div, typename func, typename... Args>
  193. vector<Car> fourthSolution(vector<Car> cars, vector<Ride> rides, func f, Args&&... args){
  194.         vector<int> partX(div+1), partY(div+1);
  195.         partX[0] = partY[0] = 0;
  196.         FWD(i,1,div+1){
  197.                 partX[i] = ((LL)r)*i/div;
  198.                 partY[i] = ((LL)c)*i/div;
  199.         }
  200.         vector<Ride> rides_parts[div][div];
  201.         vector<Car> cars_parts[div][div];
  202.         for(const auto& ride : rides){
  203.                 rides_parts[ride.a*div/r][ride.b*div/c].pb(ride);
  204.         }
  205.         int start=0;
  206.         REP(i,div) REP(j,div){
  207.                 int part = rides_parts[i][j].size() * cars.size() / rides.size();
  208.                 cars_parts[i][j].resize(part);
  209.                 start += part;
  210.         }
  211.         cars.resize(cars.size() - start);
  212.         vector<Car> result;
  213.         REP(i,div) REP(j,div){
  214.                 #define algo firstSolution
  215.                
  216.                 for(auto const& c : f(cars_parts[i][j], rides_parts[i][j], forward<Args>(args)...))
  217.                         result.pb(c);
  218.                
  219.         }
  220.        
  221.         vector<bool> XD(rides.size());
  222.        
  223.         for(auto const& c : result)
  224.                 for(auto i : c.rides)
  225.                         XD[i] = true;
  226.        
  227.         vector<Ride> notdone;
  228.        
  229.         REP(i,SIZE(XD))
  230.                 if(!XD[i])
  231.                         notdone.pb(rides[i]);
  232.        
  233.         for(auto const& c : f(cars, notdone, forward<Args>(args)...))
  234.                 result.pb(c);
  235.        
  236.         #undef algo
  237.         return result;
  238. }
  239.  
  240. int main(){
  241.         srand(time(NULL));
  242.         ios_base::sync_with_stdio(false);
  243.         int f,n,b,t;
  244.         cin>>r>>c>>f>>n>>b>>t;
  245.         vector<Ride> rides(n);
  246.         vector<Car> cars(f);
  247.         REP(i,n){
  248.                 cin>>rides[i];
  249.                 rides[i].idx = i;
  250.         }
  251.         vector<Car> best;
  252.         //const auto& sol1 = firstSolution(cars, rides);
  253.         best = firstSolution(cars, rides);
  254.         int bestscore = score(best, rides, b);
  255.         REP(i, 21){
  256.                 float perc = 0.05f * i;
  257.                 {
  258.                         const auto& temp = secondSolution(cars, rides, perc);
  259.                         int tempscore = score(temp, rides, b);
  260.                         if(tempscore > bestscore){
  261.                                 bestscore = tempscore;
  262.                                 best = temp;
  263.                         }
  264.                 }
  265.                 {
  266.                         const auto& temp = fourthSolution<2>(cars, rides, secondSolution, perc);
  267.                         int tempscore = score(temp, rides, b);
  268.                         if(tempscore > bestscore){
  269.                                 bestscore = tempscore;
  270.                                 best = temp;
  271.                         }
  272.                 }
  273.                 {
  274.                         const auto& temp = fourthSolution<3>(cars, rides, secondSolution, perc);
  275.                         int tempscore = score(temp, rides, b);
  276.                         if(tempscore > bestscore){
  277.                                 bestscore = tempscore;
  278.                                 best = temp;
  279.                         }
  280.                 }
  281.         }
  282.         REP(i, 21){
  283.                 float perc = 0.05f * i;
  284.                 {
  285.                         const auto& temp = thirdSolution(cars, rides, perc);
  286.                         cerr << "third solution " << i <<" " << score(temp, rides, b)<<endl;
  287.                         int tempscore = score(temp, rides, b);
  288.                         if(tempscore > bestscore){
  289.                                 bestscore = tempscore;
  290.                                 best = temp;
  291.                         }
  292.                 }
  293.                 {
  294.                         const auto& temp = fourthSolution<2>(cars, rides, thirdSolution, perc);
  295.                         cerr << "fourth solution " << i <<" " << score(temp, rides, b)<<endl;
  296.                         int tempscore = score(temp, rides, b);
  297.                         if(tempscore > bestscore){
  298.                                 bestscore = tempscore;
  299.                                 best = temp;
  300.                         }
  301.                 }
  302.                 {
  303.                         const auto& temp = fourthSolution<3>(cars, rides, thirdSolution, perc);
  304.                         cerr << "fourth solution " << i <<" " << score(temp, rides, b)<<endl;
  305.                         int tempscore = score(temp, rides, b);
  306.                         if(tempscore > bestscore){
  307.                                 bestscore = tempscore;
  308.                                 best = temp;
  309.                         }
  310.                 }
  311.         }
  312.        
  313.        
  314.         {
  315.                 const auto& temp = fourthSolution<2>(cars, rides, firstSolution);
  316.                 cerr << "fourth solution " << score(temp, rides, b)<<endl;
  317.                 int tempscore = score(temp, rides, b);
  318.                 if(tempscore > bestscore){
  319.                         bestscore = tempscore;
  320.                         best = temp;
  321.                 }
  322.         }
  323.        
  324.         {
  325.                 const auto& temp = fourthSolution<3>(cars, rides, firstSolution);
  326.                 cerr << "fourth solution " << score(temp, rides, b)<<endl;
  327.                 int tempscore = score(temp, rides, b);
  328.                 if(tempscore > bestscore){
  329.                         bestscore = tempscore;
  330.                         best = temp;
  331.                 }
  332.         }
  333.        
  334.         //const auto& sol2 = secondSolution(cars, rides, 0.95f);
  335.         cerr << "best score: " << score(best, rides, b) << endl;
  336.         for(const auto& car : best){
  337.                 cout << car.rides.size() << ' ';
  338.                 for(int i : car.rides)
  339.                         cout << i << ' ';
  340.                 cout << '\n';
  341.         }
  342.         return 0;
  343. }
  344.